12/08/2018, 13:38

Full text search trong Rails với Sunspot

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 ...

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.

0