Full text search trong Rails với Sunspot
Bài đăng này đã không được cập nhật trong 8 năm
Full text search trong Rails với Sunspot
1. Giới thiệu
Full Text Search (Viết tắt là FTS) là Kỹ thuật tìm kiếm chuỗi (ký tự) trên toàn bộ các trường có định dạng chuỗi trong một table trên Database
Đã có nhiều bài viết về FTS, các vận dụng kỹ thuật đó vào chức năng tìm kiếm trong Rails app bằng cách sử dụng công nghệ Elastic Search.
Elastic Search hỗ trợ khả năng tìm kiếm gần đạt thời gian thực, có khả năng mở rộng tốt, hỗ trợ nhiều tính năng. Trong bài viết này, tôi sẽ giới thiệu một công nghệ vận dụng FTS, đó là Solr.
Solr là một công cụ tìm kiếm với các đặc điểm chính là search full-text cực tốt, khả năng đánh index gần đạt thời gian thực, phù hợp nhiều database, tài liệu hỗ trợ nhiều.
2. Cách sử dụng
Ta tạo một app đơn giản hiển thị danh sách product với tên, ảnh, giá tiền và đặc điểm. Trong màn hình list, thực hiện chức năng tìm kiếm.
Thêm Sunspot và Solr gem
gem 'sunspot_rails'
gem 'sunspot_solr'
Chạy bundle install
và cấu hình cho Sunspot file
rails generate sunspot_rails:install
Lệnh trên sẽ tạo ra file /config/sunspot.yml
cho phép app chạy trên Solr server.
Để đánh index cho đối tượng, ta thêm searchable block vào model. Ví dụ, ta thực hiện full text search với trường name và description của model Product
searchable do
text :name, :description
end
Chạy Solr server
rake sunspot:solr:start
Ta có thể chạy lệnh rake sunspot:reindex
để đánh lại index cho table
Tiếp đó, trong Product controller, ta gọi fulltext để thực hiện query search:
def index
@query = Product.search do
fulltext params[:search]
end
@products = @query.results
end
Solr tìm kiếm không phân biệt chữ hoa thường thông qua các trường name và description của product dựa theo các từ mà ta nhập vào. Bạn có thể chỉnh sửa thứ tự ưu tiên search để cải thiện sự tiện dụng của kết quả search. Ta dùng hàm boost
, trường có giá trị boost
cao nhất sẽ được đóng vai trò quan trọng hơn.
searchable do
text :name, :boost => 2
text :description
end
Đánh index lại, khi đó kết quả tìm kiếm sẽ chứa những chuỗi được tìm thấy trong trường name ở vị trí cao hơn những chuỗi trong trường desciption.
Faceted Browsing
Faceted Browsing là cách thức lọc kết quả search bằng các thuộc tính thêm vào. Ví dụ, ta sắp xếp kết quả search theo phạm vi giá tiền và đếm số lượng tương ứng theo từng phạm vi đó.
def index
@query = Product.search do
fulltext params[:search]
facet :price, :range => 0..500, :range_interval => 100
with(:price, Range.new(*params[:price_range].split("..").map(&:to_i))) if params[:price_range].present?
end
@products = @query.results
end
Product sẽ được tìm kiếm theo phạm vi của giá trong khoảng 100 và nhỏ hơn 500, số lượng từng loại sẽ được tính toán
100.0..200.0 (2)
200.0..300.0 (1)
300.0..400.0 (1)
Cấu hình nâng cao
Chúng ta có thể thực hiên customize Solr. Mặc định, Solr thực hiện search full-text bằng cách chia chuỗi tìm kiếm thành các token dựa theo dấu cách và các ký tự phân chia khác sử dụng một bộ chuyển đổi thông minh StandardTokenizer
. Các token là ký tự thường và tìm kiếm dựa theo các token đó.
Bạn có thể cài đặt lại công cụ search cho phép đáp ứng với các lỗi nhập của người dùng hay cho phép các truy vấn không quá cứng nhắc. Ví dụ, bạn có thể cung cấp một vài từ đồng nghĩa, để khi người dùng không nhập chính xác từ trong record của bạn mà vẫn có thể tìm ra kết quả tương tự. Ví dụ cụ thể là khi trong database lưu một từ ipod, nhưng ta có thể thêm các từ đồng nghĩa như iPod, i-pod, i pod để tăng khả năng tìm kiếm khi người dùng nhập.
Another useful functionality you could add is stemming, which will allow Solr to match different words with the same root. For example, if the user entered 'run', they would get results with 'run' and 'running'. Or if they searched for 'walk', the results will include data that contains 'walk', 'walking', 'walked', and so on.
Một chức năng khác là stemming, cho phép Solr tìm ra các từ khác nhau với cùng một gốc nào đó. Ví dụ, nếu người dùng nhập 'run', kết quả đạt được sẽ có thể là run, running.
Các setting đó có thể được thực hiện ở solr/conf/schema.xml
.
3. Kết luận
Solr cung cấp một giải pháp cho search full-text. Mặc dù không có được các ưu điểm vượt trội như elasticsearch, nhưng Solr vẫn là một công cụ search hiệu quả và có thể là một nguồn kiến thức để ta tìm hiểu học hỏi.
All rights reserved