やりたいこと
「ナイキ スニーカー」という検索キーワードがあった場合に、ナイキ→ブランド、スニーカー→商品カテゴリとElasticsearchで分類したい。(前提としてブランド名一覧のワード集合と商品カテゴリ一覧のワード集合はあるとする) Elasticsearchで分類するメリットはアナライザにより表記揺れを吸収できる点で、「NIKE」でも「ナイキ」でもブランドとしての「ナイキ」と分類できる。 単純に考えると以下のようなElasticsearchに以下のようなクエリを投げるイメージ。
GET _search { "query": { "bool": { "should": [ { "match": { "field.analyzed": { "query": "ナイキ" } } }, { "match": { "field.analyzed": { "query": "すにーかー" } } } ] } } }
課題
Elasticsearchから返却されるのはキーワードがアナライザを通ってマッチするドキュメントが返却される場合がある。
その場合に、キーワードと分類分けの対応づけが分からなくなる。
例えば、ワード「ナイキ」で検索してドキュメント「Nike」が返却されても、「ナイキ」がブランド「Nike」と分類されたと呼び出し側は判断することができない。
これは、「ナイキ」だけで検索した場合であれば分類可能であるが、should
句で複数ワードで検索した場合は分からない。
ワード数の回数クエリを投げれば分類可能であるがこれはパフォーマンスや負荷の観点で非効率的である。
解決法
この課題はNamed queriesで解決できる。
Named queriesとは
以下のようにshould
句でOR検索をする際に、どのドキュメントがどのワードでマッチしたかもElasticsearchのレスポンスで返却される。
GET _search { "query": { "bool": { "should": [ { "match": { "field.analyzed": { "query": "ナイキ", "_name": "ナイキ" } } }, { "match": { "field.analyzed": { "query": "すにーかー", "_name": "すにーかー" } } } ] } } }
Named queriesの他のユースケース
こちらの記事で他のNamed queriesの具体的ユースケースについて触れられていました。
Use case 1 – query debugging
Use case 2 – specific query logic
Use case 3 – diversifying search results
Use case 4 – logging
検索改善へのヒントが得られるかも知れません、詳しくはリンク先へ!