概要・背景
最近の若者は、本田翼をばっさーとかって略すらしい。
ホンツバとかって略したくなるのは自分だけでしょうか?
どっちでもいいですが、検索エンジン的には、
本田翼も、ホンツバも、ばっさーも、同じ結果を返して欲しいですよね?
もちろん、検索システムを含むサービスの運営側としては、同じ結果を返したいですよね?
ジョブメドレーではElasticsearchを使っているので、それをうまくチューニングしたというお話。
ElasticSearchについて理解する
Elasticsearchについて無知過ぎたので、そもそもまずは概形を学ぶところからスタート。
以下は、勉強に使った一部の資料。
- http://code46.hatenablog.com/entry/2014/01/21/115620
- http://blog.shibayu36.org/entry/2015/07/08/095838
- https://medium.com/hello-elasticsearch/elasticsearch-6d69b6ff5c26#.tf71jaycs
わかったこと(今回はこれだけ知っていれば、行ける)
- データからインデックスを作成して、検索時にクエリを発行して検索する
- アナライザーは、Toknizerでパースされ、Filterで整理される
- アナライザーは、インデックス作成用と検索用がある
Ruby on Railsに組み込む
今回、組み込むにあたり、「辞書は定期的にいれかえる必要がある」という要件があった。
そのため、辞書更新の度に、インデックスをすべて更新するのはコストが高いので検索時のanalyzerだけ設定することにした。
辞書ファイルの作成
辞書ファイルの書き方は、大まかに3種類ある。
https://www.elastic.co/guide/en/elasticsearch/reference/1.4/analysis-synonym-tokenfilter.html
を参考に
# 下記の用に=>を使うとマッピングされ
# ばっさーと検索すると、本田翼の結果が引っかかる
# ※「ばっさー」の結果は引っかからない
ばっさー => 本田翼
# 下記のようにカンマ(,)でつなげると
# 本田翼やばっさーで、検索すると
# 本田翼とばっさーとほんつばで検索した結果がすべて出る
ばっさー,本田翼,ほんつば
# 複数指定もできる
ばっさー=>ほんつば,本田翼
# 上書き方式ではなく、追加方式
# 下記の例は ばっさー=>ほんつば,本田翼と同じ
ばっさー=>ほんつば
ばっさー=> 本田翼
※追加終わったら、elasticsearchを再起動する
Elasticsearch-inquisitorを使って、実際できているかを見る
http://blog.johtani.info/blog/2013/09/23/intro-elasticsearch-inquisitor/
で紹介されているElasticsearch-inquisitorを使い、実際に検索クエリの単語がうまく解釈されているかを確認する。
※Elasticsearchがきちんと再起動されていることを確認する
検索側のクエリにanalyzerを指定する
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
を見るとanalyzer: The analyzer name used to analyze the query string.
というのがあるので、
{
'query_string' : {
'default_field' : 'content',
'default_operator': 'AND',
'query' : 'ばっさー',
'analyzer' : 'search_analyzer',
}
}
これで検索できる
まとめ
- elasticsearchで類似語検索する場合は、Synonym Token Filterを使う
- 基本的には、filterを設定しanalyzerを書いて、elasticsearchを再起動する
- query string queryを使い、analyzerを設定し検索する
以上