Querqyの調査(その1)

Posted by johtani on Wednesday, July 20, 2022

目次

Querqyというクエリのリライト用のプラグインがあるのでどんなものかを調べてみました。とりあえずは概要をドキュメントから追いかけてみた感じです。対応しているのはSolrとElasticsearch(以降、Es)になります。手元にはEsの環境があるのでそちらで試してみました。

なにもの?

EsやSolrのプラグインで、ルールやパラメータを利用して、クエリの書き換えをEsやSolr側で行えるプラグインです。 なお、本記事ではEsのプラグインを説明します。 今回はドキュメントを読みながらメモを取った感じなので、詳細については公式ドキュメントを見ていただくのが良いかと。 手元では動作させてみましたが、今回の記事ではざっとメモを取っただけになります。

インストール

Esのpluginコマンドでインストール可能ですが、Mavenにアップロードされているバージョンは限定的なので、必要に応じて自分でビルドする必要があります。 対応しているかは、公式ドキュメントのInstallationのプルダウンが参考になります。

どうやって使うの?

Query DSLにquerqyというクエリが追加されるので、あとはドキュメントをもとにクエリを組み立てるクエリを書いていきます。 すると、プラグインが指定されたルールに従い、EsのQueryに書き換え、実際の検索が実行して結果が返ってきます。 普通にmatchなどの既存のQueryと同レベルのものになるので、既存のEsのクエリと組み合わせた使い方もできるようです。

サンプルとして紹介されている短めのクエリ(このクエリではルールによるクエリの書き換えはない)。

GET ecommerce/_search
{
   "query": {
       "querqy": {
           "matching_query": {
               "query": "notebook"
           },
           "query_fields": [ "title^3.0", "brand^2.1", "short_description"]
       }
   }
}

また、書き換え(Rewriter)の設定をElasticsearchに対して保存できるエンドポイント_querqy/rewriterが用意されています。

Synonymの書き換えを行なうサンプル(後述するCommon Rules Rewriterの設定)。

PUT  /_querqy/rewriter/common_rules
{
    "class": "querqy.elasticsearch.rewriter.SimpleCommonRulesRewriterFactory",
    "config": {
        "rules" : "notebook =>\nSYNONYM: laptop"
    }
}

どんな書き換えができるの?

用意されているRewriterは2022年7月時点では次のようなものになります(がんばれば、Javaで実装すれば自作もできそう)。

  • Common Rules Rewriter
  • Replace Rewriter
  • Number Unit Rewriter
  • Word Break Rewriter

また、複数のRewriterをチェインして使うこともできる。記述した順番で適用されます。 それぞれのRewriterについて簡単にメモを。

Common Rules Rewriter

シノニム、結果のブースト、フィルター、結果に対して追加情報を付与したりできます。

rulesにルールを記載していきます。 以下のようなフォーマットになっています。 クエリが入力に合致したら、ルールが適用される形です。プロパティは後述しますが、ルールの適用する順序などをハンドリングするために使用します。

入力 => 
  ルール
  ルール
  @プロパティ
  @プロパティ

入力部分に関する書式

ルールの左辺に該当する部分で、クエリに入力された文字列がマッチするかどうかで、右辺のルールを適用するかがきまります。

  • 入力の一致の条件は次のような感じです。
    • 完全一致、前方一致、後方一致の使い分けが可能。ダブルクォート"で制御
    • デフォルトでは、大文字小文字の区別なし(後述するオプションで変更可能)
    • 単語の末尾にワイルドカード*で1文字以上にマッチ。入力の最後にだけ利用可能

書き換えの命令(ルール)

右辺に利用できる命令で、次のようなものがあります。

SYNONYM

同義語展開するための命令です。Synonym Token Filterとの違いは、複数のルールを同時に適用できます。 フィールドに依存しない設定なのでメンテナンスが楽になるとのこと。 ただし、双方向の設定はないため、例えば"personal computer"と"pc"の場合、2つの設定を個別に定義する必要があります。 また、ステミングなどには未対応なので、“personal computers"も対応する場合はこれも追加する必要があります。 類義語ごとに重みを変えることが可能になっています。同列ではなく、同義語のスコアを下げるなどで、リコールを増加させつつ、入力語のスコアを上位にすると行ったことが可能です。

UP/DOWN

入力文字列がマッチした場合に、追加のクエリを正か負のブーストをしつつ追加できます。 例えば、「iphone」と検索された場合に、「apple」もクエリとして追加しつつスコアをブーストし、「case」のクエリをスコアを下げるように追加できます。 これにより、アクセサリーではなく本体が検索結果の上位に出てくるような仕組みを提供できます。

FILTER

UP/DOWNではクエリとして追加されていたが、こちらはフィルターとして追加されます(=スコアで調整ではなく、結果から除外される)。

DELETE

クエリからキーワードを削除できます。 単語自体をそのまま削除することも、入力された単語に合わせて他の単語を削除することもできます。

DECORATE

2022年7月時点でEsでは利用不可で、Solrのみで利用可能です(なので読み飛ばしました)。

プロパティ

各ルールの設定にタグをつけられるような機能です。 このプロパティを利用して、ルールのソートやフィルタリングなどが可能になります。 複数のルールにクエリがマッチした場合に、優先度が最高のものだけを適用したり、プロパティに特定の値を持っているものだけを採用したりできます。 なお、プロパティは命令のあとに記述する必要があります(パーサーの関係かな?)。

Replace Rewriter

クエリタームの置き換え用のRewriterです。クエリの正規化処理として、他のRewriterの前処理に利用したりできます。 サンプルではタイポの修正などに利用したり、不要な語の除去などがあげてありました。

Word Break Rewriter

クエリトークンを分解・結合します。 たとえばドイツ語は、複合語と呼ばれる個別の意味の単語を結合した1つの単語を持っているため、個別の意味に分解して検索すると便利なことがあります。 そういった単語を辞書を基にして分割できるようにする機能です。 辞書とは実際のインデックスのタームディクショナリのことと思われます(要調査。どのインデックスのフィールドを指し示すのかなど、設定とドキュメントではよくわからない)。 なお、利用可能な形態素解析を基にした実装はドイツ語のみとなっており、また、分解の時には形態素解析を考慮しますが結合時には考慮しません。

Number-Unit Rewriter

クエリの数値と単位を判別し、対象となるフィールドにマッチさせます。範囲での一致や完全一致やブーストが可能です。 単位をもとにして、特定のフィールドに対する数値のクエリに書き換えることができます。

Shingle Rewriter

Solrのみで利用可能なので読み飛ばしました。

ルールはどこに保存されるの?

.querqyというインデックスが内部で作成され、そこに保存されます(公式ドキュメントより)。 (ちなみに、Mappingはこんな感じみたいです)。 現状、プラグインでは設定したRewriterの取得ができないようなので、自分で登録した設定がどんなものかは、このインデックスを検索する必要がありそうです。

気になった点・改善点?

気になった点があったので。

  • Rewriterのエンドポイントは、登録・更新・削除のみ対応しており、登録したものの確認は直接インデックスを見に行くしかなさそうです(Issueは作られてた)。
  • [要検証]書き換えられたクエリがどんなものか?は残念ながら確認できなそうで、_validate/queryで最終的なLuceneレベルのクエリで確認するしかなさそう?
  • スキーマ側で定義したものと、Querqyで定義したものの兼ね合いがどういう形になるのか?などを気にする必要があるのが注意点かも。組み合わせたときの副作用などがどんなことになりそうか?が予測がつきにくそう。
  • Rewriterの定義自体のテストはどうしたものか?

まとめ

とりあえず、ざっとドキュメントを見ながらメモを取った感じです。 設定などの記述が独自のものなので、そこに慣れていく必要がありそうです(特にルールの改行の部分とか)。 次は実際にどんな感じで使えそうか、既存の仕組みとの違いは?みたいなところをもう少し見ていきたいとおもいます。

参考文献


comments powered by Disqus

See Also by Hugo


Related by prelims-cli