Full text search with Thinking Sphinx
ในหัวข้อนี้เราจะมาลองใช้ Sphinx เป็น full text search บน Rails กัน:
- Ruby 3.1.2
- Rails 7.0.4
- Sphinx 3.3.1
- Thinking Sphinx 5.4.0
Getting Started
ทำการติดตั้ง Sphinx ทำตามขั้นตอนในนี้ได้เลย
สร้าง rails app โดยใช้ mysql เป็น database:
1
rails new shopshop --database=mysql
จากนั้นเพิ่มบรรทัดนี้ลงใน Gemfile:
1
gem 'thinking-sphinx'
แล้วเรียกคำสั่ง bundle install
ที่นี้เราจะสร้าง model ที่ต้องการจะใช้ค้นหา ในที่นี้ก็จะใช้เป็น product:
1
2
3
rails g scaffold Product name detail:text
rails db:migrate
rails s
เพิ่ม search ใน routes:
1
2
3
4
5
6
7
Rails.application.routes.draw do
resources :products do
collection do
get 'search'
end
end
end
เพิ่ม search ใน products controller:
1
2
3
4
5
6
7
8
class ProductsController < ApplicationController
...
def search
@products = Product.search(params[:q])
render :index
end
...
end
เพิ่มฟอร์มสำหรับ search ในหน้า index ของ products:
1
2
3
4
<%= form_tag search_products_path, method: :get do %>
<%= text_field_tag :q %>
<%= submit_tag :search %>
<% end %>
จากนั้นเราจะสร้างไฟล์เพื่อกำหนดว่าจะทำ index กับข้อมูลอะไรบ้างใน model นั้น โดยรูปแบบจะเป็นแบบนี้ app/indices/[modelname]_index.rb
:
สร้างไฟล์ index ของ product ใน app/indices/product_index.rb
และกำหนดตัวแปรที่จะทำ indexing:
1
2
3
4
ThinkingSphinx::Index.define :product, with: :real_time do
indexes name, sortable: true
indexes detail
end
เรียกใช้คำสั่งเพื่อทำ index แล้วเริ่มใช้ Sphinx:
1
2
3
4
5
6
rails ts:configure
rails ts:stop
rails ts:index
rails ts:start
# or
rails ts:rebuild
ถ้าไม่อยากทำ indexing ด้วยมือทุกครั้งที่มีข้อมูลเพิ่ม ให้เราเพิ่มส่วนนี้ลงไปเพื่อจะได้ทำ indexing แบบ real time:
1
2
3
4
class Product < ApplicationRecord
ThinkingSphinx::Callbacks.append(self, behaviours: [:real_time])
end
เพิ่มการตั้งค่า charset เพื่อให้รองรับการค้นหาด้วยอักษรภาษาไทย:
1
2
development:
charset_table: "0..9, A..Z->a..z, _, a..z, U+E00..U+E7F"
Conclusion
การค้นหาภาษาไทยสำหรับ Sphinx จะค้นหาได้ไม่สมบูรณ์นัก เพราะไม่มีฟีเจอร์การตัดคำ ซึ่งภาษาไทยไม่ได้เว้นวรรคแบบภาษาอังกฤษ ซึ่งผมก็ได้สร้าง gem สำหรับใช้ตัดคำเพื่อให้ค้นหาด้วย Sphinx ได้ เข้าไปดูแล้วทำตามได้เลย