このブログは Introduction to query rules in Elasticsearch | Elastic Blog を和訳したものです。
https://www.elastic.co/jp/blog/introducing-query-rules-elasticsearch-8-10Elasticsearch 8.10 において、新たに Query Rule 機能が追加されました。Query Rule は検索クエリや検索クエリに含まれるコンテキスト情報に応じてクエリを書き換える機能です。
Query Rule とは?
Query Rule は通常 Elasticsearch の検索シーンにて考慮されるようなクエリに対する関連度とは別の観点から検索結果をカスタマイズする方法で、主に検索クエリに含まれる検索コンテキスト情報を用る機能です。これにより、ユーザは例えばマーケティングのキャンペーンやパーソナライゼーション、特定の領域に特化した検索体験の提供などをすべて Elasticsearch 単体にて提供可能となります。
サポートされているルールの種類
この Query Rule 機能の第一歩として、特定の文書を検索結果内で優先的に表示することが可能な Pinned query rules をサポートしました。
この用途としては例えば
- ユーザが iPhone と検索した場合に、上位に最新機種を表示する
- ユーザが iPhone と検索した場合に、他のブランドから販売されているオススメ商品を表示する
- football という検索に対して、ユーザの居住地によって異なる検索結果を提供する
- 重要なお知らせをユーザ全員の検索結果に表示するために利用する
- 次の評価期間に関するお知らせを、マネージャ以外の全従業員の検索結果に表示する
等々が想定されます。
サポートされている検索条件の種類
Query Rule でサポートされているクエリへのマッチ条件は以下の通りです。 *1
- exact : 想定されたクエリに完全一致
- fuzzy : 想定されたクエリからの編集距離が一定以内
- prefix : クエリが特定の文字列から始まる
- suffix : クエリが特定の文字列で終わる
- contains : クエリが特定の文字列を含む
- lt : 値が指定されたもの未満
- lte : 値が指定されたもの以下
- gt : 値が指定されたものより大きい
- gte : 値が指定されたもの以上
- always : すべてのクエリにマッチする
サポートされている固定方法の種類
Pinned query rules では2種類の固定方法がサポートされています。*2
- ids : 文書IDを指定して固定
- docs : インデックス名と文書IDのペアを指定 (訳注: 複数インデックスをまたいで検索するユースケースなどで想定。)
Query Rule の利用方法について
Query Rule を利用する際には、以下のプロセスに従いルールを作成・適用してください
- (事前準備) 検索システムの管理者が1つ以上の Query Rule を含んだルールセットを作成する
- Query Rule 管理APIを用いて、作成したルールセットを Elasticsearch に登録する
- (検索時) Rule query を利用して検索する
- Elasticsearch が指定されたルールセットおよびクエリにマッチするルールを特定する
- マッチしたルールをルールセットに登録された順に適用する
- Query rewrite phase にて、pinned query に書き換えられる
- 検索クエリにマッチしたドキュメントが返却され、その際 pinned query にマッチしたドキュメントが優先的に並べられる
以下の画像はその動作を示したダイアグラムです
利用例
簡単な利用例を見てみましょう。また、Elasticsearch Labsに沿ってお試しいただくことも可能です。
とあるECサイトが新しく発売した PureJuice Pro というワイヤレス充電器を宣伝しようとしています。
インデックスは以下のドキュメントを含みます。
POST /products/_doc/us1 { "name": "PureJuice Pro", "description": "PureJuice Pro: Experience the pinnacle of wireless charging. Blending rapid charging tech with sleek design, it ensures your devices are powered swiftly and safely. The future of charging is here.", "price": 15.00, "currency": "USD", "plug_type": "B", "voltage": "120v" } POST /products/_doc/uk1 { "name": "PureJuice Pro - UK Compatible", "description": "PureJuice Pro: Redefining wireless charging. Seamlessly merging swift charging capabilities with a refined aesthetic, it guarantees your devices receive rapid and secure power. Welcome to the next generation of charging.", "price": 20.00, "currency": "GBP", "plug_type": "G", "voltage": "230V" } POST /products/_doc/eu1 { "name": "PureJuice Pro - Wireless Charger suitable for European plugs", "description": "PureJuice Pro: Elevating wireless charging. Combining unparalleled charging speeds with elegant design, it promises both rapid and dependable energy for your devices. Embrace the future of wireless charging.", "price": 18.00, "currency": "EUR", "plug_type": "C", "voltage": "230V" }
この時、ワイヤレス充電器を検索するクエリは以下の通りです。
POST /products/_search { "query": { "multi_match": { "query": "wireless charger", "fields": [ "name^5", "description" ] } } }
Query Rule の管理
まず初めに、manage_search_query_rules
権限を持った管理者が以下のルールセットを登録します。
PUT /_query_rules/promotion-rules { "rules": [ { "rule_id": "us-charger", "type": "pinned", "criteria": [ { "type": "contains", "metadata": "my_query", "values": ["wireless charger"] }, { "type": "exact", "metadata": "country", "values": ["us"] } ], "actions": { "ids": [ "us1" ] } }, { "rule_id": "uk-charger", "type": "pinned", "criteria": [ { "type": "contains", "metadata": "my_query", "values": ["wireless charger"] }, { "type": "exact", "metadata": "country", "values": ["uk"] } ], "actions": { "ids": [ "uk1" ] } } ] }
このルールセットでは、以下の2つのルールを定義しました。
- ユーザがwireless charger
を検索しており、かつ US に居住している場合、US側のプロダクトを検索結果の上位に固定する
- ユーザがwireless charger
を検索しているが UK に居住している場合、UK側のプロダクトを代わりに検索結果の上位に固定する
Tips: 実際の検索時には裏側で Pinned Query に変換される関係上、以下の制約に従う必要があります。
ids
の利用と`docsは二者択一であり、同時に利用することはできません。管理観点からも、同一ルールセット内でどちらを利用するかを事前に決めておくことをお勧めします。- Pinned Query は最大100文書の固定までしかサポートされていません。Query Rule もこれに準拠します。
Query Rule を用いた検索
Query Rule を検索に適用するためには rule_query
を利用して検索します。具体的には以下のようになります。
POST /products/_search { "query": { "rule_query": { "organic": { "multi_match": { "query": "reliable wireless charger for iPhone", "fields": [ "name^5", "description" ] } }, "match_criteria": { "my_query": "reliable wireless charger for iPhone", "country": "us" }, "ruleset_id": "promotion-rules" } } }
このクエリは以下のパートから構成されます
- 検索およびランキングを行う
organic
クエリ。もし query rule が何も適用されない場合、純粋にこのクエリが実行されます。 - ルールセットを参照するクエリを指定する、
match_criteria
。例では2つの条件を指定しています。- ユーザが入力したクエリをそのまま伝達するための
my_query
- ユーザの居住地をIPから判別した
country
- ユーザが入力したクエリをそのまま伝達するための
- どのルールセットを参照するかを指定する
ruleset_id
。
ルールセット内に登録されたルールを一つずつ確認すると、以下のルールが検索条件にマッチすることがわかります。
{ "rule_id": "us-charger", "type": "pinned", "criteria": [ { "type": "contains", "metadata": "my_query", "values": ["wireless charger"] }, { "type": "exact", "metadata": "country", "values": ["us"] } ], "actions": { "ids": [ "id1-us" ] } }
ここで、ルールが適用されるには定義されたすべてのcriteria
に適合する必要があることに注意してください。
最後に、検索クエリは実行される前に以下のような形に書き換えられます。
{ "query": { "pinned": { "organic": { "query_string": { "query": "reliable wireless charger for iPhone" } }, "ids": [ "id1-us" ] } } }
Elasticsearchは書き換えられた pinned query を利用して検索を行い、適合したプロダクトを優先的に返却します。
まとめ
本記事では Query Rule を用い、検索コンテキストに応じて文書を優先的に表示する方法を紹介しました。