はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

検索エンジン Elasticsearchのスコアリングの頑張り方についてmy講釈(というか雑ポエム)

はじめに

itdepends.hateblo.jp

上記でfunction_scoreのお試しをしたこともあり、Elasticsearchのスコアリングについて講釈をたれてみたくなったので、記事にしました。

まえおき等

確認したのは、Elasticsearch6.4です。ただし、特にクエリ例などは出てきません。また、うっすら想定しているのは「レストラン検索サイト」的なものです。

下記の講釈は、他の例でもあてはまるものはあると思いますが、逆にちょっと違うかもと思ったあなたはおそらくそれが正しいと思います。Good Questionです。

また、ググってこの記事に流れてきた方には申し訳有りませんが、クエリDSLのワードはチラチラ出てくるもの、見てのとおりあくまで単語のみです。ひょっとすると前の記事の方がお求めのものかもしれませんので、もしよかったら上記リンクの方をごらんください。

スコアリング講釈

さて、その講釈なのですが、いきなりの画像貼り付けです。そして絵の割に字が多い。

だったらせめてslideshareでもというところがそうでもなかったり... でも良いんです。独り言だから。

スコアリングとは

シンプルなパターンマッチのGREPや通常のSQLと異なり、検索エンジンユースケースでは自由形式のドキュメントが対象です。

検索語も、表記揺れから始まって誤記や同義語の表現違い、広義語などユーザー側もこれまた自由形式です。

また、ドキュメントの方に戻ると、検索語と同じ語が何回も出てくるドキュメントは一般に、検索語の出現数が少ないドキュメントよりはユーザーが探しているものに近いと思われますが、

そんな中、ユーザーが求めているドキュメントにより近いと思われるものについて、様々な要素・観点で採点してやり、ベターなものを返してあげましょう、というのがスコアリングです。

このあたりでキャッチの絵があっても良さそうですが無し

例えばElasticsearchのスコアリングは何ができる

例えばですが、Elasticsearchのスコアリングではこんなことができます。というのを以下にまとめてみました。

ただし、ここでは、体系的にまとめたというよりは、先のレストラン検索サイト的なものをうっすら頭に浮かべているのと、私の「講釈」「主張」に寄せて偏りがあるのでご了承ください。 (本当に必要な場合には、Elasticsearchというかluceneを源流とする検索エンジンはいろいろできると思いますが、ここでは私の主張と知っている範囲のバイアスがあることにご注意ください。)

f:id:azotar:20190504133910p:plain

オレオレ用語集(個人的には気に入っている)

なお、スコアリングに出てくる加減乗除は、全てスコアリング、加点・減点、ブースト係数、重み係数どうとでも呼べるのですが、これがくせもので、ディスカッションなどで下手に厳密に使い分けると必要以上に難しくなるのと、一方でごちゃまぜだとそれはそれで議論にならないというジレンマに遭遇します。

このコミュニケーションに関する問題についてこれといった解決方法は思い当たらないのですが、上記の図でも一部示唆しているとおり、定義無しで使えそうな用語として次の用語を勢いで使って話をするようにしています。

  1. できばえ点: TF-IDFとかBM25周辺で今だったら検索エンジンがよしなに検索してくれる採点のこと
  2. 配点: 私自身は結局、スコアリングは各要素点のバランスや全体の大小関係の納得度の高い組み合わせをひねり出すことだと考えています。その際に、他の採点が同じ場合に、ある採点条件で決勝戦になる場合に、階級Aは10点、Bは5点というようなことを議論することになるのですが、この様は、実際はひとつずつ採点をすると言うよりは全体のパイを優先度の高いものに大きく割り当てる様のようなイメージを持っているので、「割り当て・配っている感」をイメージしやすい「配点」という言葉を使うことにしています。
  3. ボーナス: 基本の検索条件そのものではなく、基本の検索条件にヒットした前提のもと、その文書が特定の属性や条件に該当した場合に、追加で加点される類のものを言う。
  4. コンボ: 複数の採点基準を複雑に噛み合わせてさらに加点するなどの例。個人的には格ゲーで使われるコンボをイメージ。(ちなみに、「コンボ」はあまりやらない方が良いというのが私の主張です。)
  5. 持ち点:(少なくとも)検索エンジニアは、検索時に決まるスコアと最初から決まっているスコア(該当した時に加点されるもの)の概念はしっかり分けて考えるべきだと思っています。後者は「特権」となることも多くその雰囲気が伝わるではと思い「持ち点」と呼ぶことにしています。前者も良い呼び名があればと思いますが、今のところしっくりくるものを思いつかず。

それぞれ、もっとキャッチーなワードがあればどなたか教えてください。

スコアリング要件のあるある例とアプローチ

f:id:azotar:20190504133921p:plain

f:id:azotar:20190504133929p:plain

まとめ

ということで(特に定義はしていませんのでアレですが)レストラン検索サイトを検討しているとして、私がスコアリングの検討の際にこんなやり方をしたら良いと思っているポイント絞って再度まとめます。

◆私の思うスコアリングとは...のまとめの表

f:id:azotar:20190504133934p:plain

さいごに

今後時間があれば、上記の講釈にしたがってプログラムやクエリで事例風のものを提示して(逆につっこみを受けて)みたい気持ちがあることを述べて、ひとまずこの記事は終わりとします。