Post

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 ได้ เข้าไปดูแล้วทำตามได้เลย

This post is licensed under CC BY 4.0 by the author.