好像搞懂 searchkick 的 field 到底是怎麼用的了
- Backend
- 30 Aug, 2020
之前在看 searchkick 的 Github README 時,一直搞不懂 field 這個單位到底是什麼,於是花了一點時間來研究, gem 本人在此:
searchkick 這個 gem 是封裝了幾個 Elasticsearch 相關的 gem,讓我們用 ActiveRecord 的方式,去操作 Elasticsearch 的 API。
但是我在看 Partial Match 的說明時一直搞不太懂這樣設定
class Product < ApplicationRecord
searchkick word_start: [:name]
end
加上必須在搜尋時寫上 fields 跟 match 是麼意思
Product.search "back", fields: [:name], match: :word_start
後來經過一番研究後終於搞懂了。
一個 field 就是對應到 search_data Hash 的一個 key, 例如
def search_data
{
name: name,
}
end
而
class Product < ApplicationRecord
searchkick word_start: [:name]
end
裡的 word_start: [:name] 意思,就是對 name 這個 field 的,要建立一個使用 word_start 的 analyzer 的 index。
而
Product.search "back", fields: [:name], match: :word_start
的意思是,對name field 的 word_start index 搜尋。
其實一個 field 其實可以建立多個不同 analyzer 的 index,所以其實可以這樣用:
class Product < ApplicationRecord
searchkick word_start: [:name], word_middle: [:name]
end
而在搜尋時則可以指定使用不同的 analyzer,來決定現在要搜尋哪一個 index
Product.search "back", fields: [:name], match: :word_start
Product.search "back", fields: [:name], match: :word_middle