精度に影響を与えずにフィールドでドキュメントをブーストする

トピック作成者:ks-solruserml-bot (2024/06/04 22:17 投稿)
3
CloseClose

(The bot translated the original post https://lists.apache.org/thread/xdjprzrp3b492jr3hcys71053djf5nwt into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

こんにちは、皆さん、

私たちはSolr 7.3.1を本番環境で使用しており、他の種類のドキュメントと共に数千のブログをSolrにインデックス化しています。現在、「著者名 + トピック」で検索する場合にauthorフィールドにもっと重みを付ける必要があるという要件に取り組んでいます。

例えば、author、title、textという3つのフィールドがあるとします。「Brian marketing」と検索すると、Brianが著者である「marketing」に関するブログは、Brianがtitleやtextフィールドに言及されている他のブログよりも高くランク付けされるべきです。

これを達成するために、authorフィールドにもっと重みを付けることを考えました。これは問題なさそうですが、フレーズクエリの場合にauthorフィールドが一致しないように、solrconfig.xmlファイルのmm(最小一致)パラメータを100%から1に更新する必要がありました。このmmの変更の副作用として、総ヒット数が劇的に増加し、精度に影響を及ぼしています。
以下のようにsolrconfig.xmlで条件付きmmを使用して、この変更の他のフィールドへの影響を最小限に抑えようとしました、特に大きなフレーズクエリの場合です:

<str name="defType">edismax</str>
<str name="qf">title^2 author^3 text</str>
<str name="mm">1<50% 4<-1</str>
<str name="tie">0.1</str>

ここで、私の質問は次のとおりです:
1) authorフィールドに対してだけmm(=1)を上書きし、他のすべてのフィールドに対してmm = 100%を維持する方法はありますか?
2) 私のアプローチは正しいでしょうか?望む結果を達成するためのより良い方法はありますか?

事前にありがとうございます。

Vinay

返信投稿者:ks-solruserml-bot (2024/06/04 22:17 投稿)

こんにちは、皆さん、

再度確認しますが、この件についてご意見をいただけないでしょうか。

返信投稿者:ks-solruserml-bot (2024/06/04 22:18 投稿)

こんにちは、Vinay、

もし著者フィールドを強調したいが、それを特定の検索フィールドにしたくない場合、qfにリストするのではなく、boostパラメータ【1】を使用してBoostQuery【2】を作成し、ブーストクエリとして扱う必要があります。関数クエリ【3】は非常に柔軟なので、これを使ってさまざまなことができます。

例えば、ユーザーのメインクエリテキストを使用して著者フィールドを検索するサブクエリquery()を作成することができます。それが一致した場合、そのスコアまたはif()やdef()を使って定義したスコアが、ドキュメントのスコアに乗算されます。

よろしくお願いします、
Markus

【1】https://solr.apache.org/guide/6_6/the-extended-dismax-query-parser.html
【2】https://solr.apache.org/guide/6_6/other-parsers.html
【3】https://solr.apache.org/guide/6_6/function-queries.html

返信投稿者:ks-solruserml-bot (2024/06/04 22:18 投稿)

こんにちは、Vinay、

理想的には、単語や単語の並びに対して最適なフィールドを特定したいと考えています。
例えば、
「Brian marketing」
Brian -> author
marketing -> topic

クエリが構造化されている場合、それは簡単で、edismaxを使わなくても自分の好きなようにLuceneクエリを直接構築できます(この場合、mmは重要ではありません)。

私の仮定では、あなたのクエリは構造化されておらず、edismaxを使用して理想的なマルチフィールドクエリを解析しています。
edismaxがマルチフィールドクエリを扱う方法は難しいです。
最近書いたブログ記事が役立つかもしれません:
https://sease.io/2021/05/apache-solr-sow-parameter-split-on-whitespace-and-multi-field-full-text-search.html
最近、mmとedismaxに関するバグを修正しました:
https://github.com/apache/solr/pull/158
マルチフィールド検索専用の新しいクエリパーサーに取り組んでいるので、Solrの更新情報やブログを注目してください。

mmは主に「ドキュメントごと」であり、(簡単に制御できない形で)「フィールドごと」に切り替わります。
したがって、Luceneクエリ言語で事前にクエリを構造化しない限り、フィールドごとに異なるmmを指定することはできません。

mm=1に設定し、boost=topic:<クエリ用語をANDで接続>を設定すると、あなたが必要としている動作に近いものが得られます:
1) 著者フィールドに対してのみmm=1をオーバーライドし、他のすべてのフィールドではmm=100%を維持する方法はありますか?
mm=1 & boost=topic:(term1 AND term2 AND term3) & boost=title:(term1 AND term2 AND term3)
これは、マッチングフェーズで少なくとも1つのクエリ用語がドキュメント内に含まれている必要があることを意味します。
その後、すべてのクエリ用語にマッチするものがトップランキングの結果となります。
また、フレーズフィールド(およびngramsフィールドを含む)pf、pf1、pf2を使用することも有用かもしれません(これらはフレーズとシングルに基づく厳密なブーストポリシーを構築します)。

よろしくお願いします

Alessandro Benedetti
Apache Lucene/Solr コミッター
ディレクター, R&D ソフトウェアエンジニア, 検索コンサルタント

www.sease.io

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?