最近、検索エンジン及びサジェストエンジンとしてelasticsearchを検討しているのでメモ。
Completion Suggesterとは
登録されたワードを前方一致で検索する機能。「ピ」っていれたら「ピンクフロイド」が出たり「ジ」っていれたら「ジェネシス」って出るアレを実現する技術。
公式ドキュメント
mappingの登録
PUT /music/song/_mapping
{
"song": {
"properties": {
"name": {"type": "string"},
"artist": {"type": "string"},
"released": {"type": "integer"},
"suggest": {
"type": "completion",
"index_analyzer": "simple",
"search_analyzer": "simple"
}
}
}
}
データ登録
先ほどのマッピングに合うデータを登録します。
この時、mappingで定めたpropertiesに加えてsuggest
属性を登録しておくのがミソ。
このsuggest
キーに登録された値が前方一致の対象になります。
// データ1
PUT /music/song/1
{
"name": "Love in your Eyes",
"artist": "Caravan",
"released": "13123131",
"suggest": "Love in your Eyes"
}
// データ2
PUT /music/song/2
{
"name": "Lovely Baby",
"artist": "Unknown",
"released": "13123131",
"suggest": "Lovely Baby"
}
クエリ発行
/インデックス名/_suggest
に対してPOSTします。(typeは含めない)。
song-suggest
の部分は何でもいいっぽいです。サジェスト結果がこのキー名で参照できます。
POST /music/_suggest
{
"song-suggest": {
"text": "love",
"completion": {
"field": "suggest"
}
}
}
// 結果
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"song-suggest": [
{
"text": "love",
"offset": 0,
"length": 4,
"options": [
{
"text": "Love in your Eyes",
"score": 1
},
{
"text": "Lovely Baby",
"score": 1
}
]
}
]
}
その他
データ登録時にpayload
でサジェスト結果にデータを付加したり、weight
でサジェストの優先順位をつけることができるっぽいです。