子ドキュメントのスコアをブーストして、親ドキュメントのみを返す

トピック作成者:ks-solruserml-bot (2024/08/21 22:06 投稿)
4
OpenOpen

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

こんにちは皆さん、

私たちは約2年間Solrを使用しており、現在、クエリの関連性を向上させるためにクエリを拡張しようとしています。私たちのケースでは、親ドキュメントと子ドキュメントがあり、場合によっては子ドキュメントが結果のソート方法を改善するのに役立つことがあります。しかし、現時点では、子ドキュメントに基づいて親ドキュメントをブーストする簡単な方法が見つからず、何か間違っているのではないかと考えています。これは一般的な使用ケースだからです。以下は親ドキュメントと子ドキュメントの例です。

  • 親ドキュメント
{
  "_parent_": true,
  "_root_": "book/1",
  "id": "book/1",
  "docType": "book",
  "title": "Great Expectations",
  "summary": "... some text ..."
}
  • 子ドキュメント
{
  "_parent_": false,
  "_root_": "book/1",
  "id": "author/1",
  "docType": "author",
  "name": "Charles Dickens",
  "country": "England",
  "rating": 4.6
}

このようなクエリを作成することができます:

q=great
&defType=edismax
&qf=title^5 summary
&fq=docType:book
&fl=*,score

今、著者ドキュメントのratingフィールドを関連する本のドキュメントのスコアに加えるために、このクエリをどのように拡張するか、さらに、オーストラリアの著者が書いた本を2倍の評価値でブーストするにはどうすればよいかを知りたいです。どちらの場合も、結果に親ドキュメントのみを表示する方法についても教えてください。

よろしくお願いします。

Ned

返信投稿者:ks-solruserml-bot (2024/08/21 22:07 投稿)

こんにちは Ned。

まずはガイドを確認してください:
https://solr.apache.org/guide/solr/latest/query-guide/searching-nested-documents.html#parent-query-parser
Solrの構文は煩雑であることに注意してください。
基本的には、親クエリと結合された親クエリの2つを組み合わせる必要があります。

q=+{!edismax qf='title^5 summary' v=$pq} {!parent which='parent:true' score=max v='+docType:author country:Au^=10'}&pq=great

各試行後にdebugQuery=true出力を確認し、クエリが予想通りに解析されていることを確認してください。
JSON Query DSLから始めるのも理にかなっています。
頑張ってください。

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2024/08/21 22:07 投稿)

ありがとう!Mikhailの回答はとても役立ちました。

私たちはテストを行い、他のクエリと組み合わせるなどして試してみました。しかし、動的に結果をブーストすることができませんでした。これは私たちの質問の第二部分に関連しています。「オーストラリアの著者によって書かれた本を、彼らの評価値を2倍にしてブーストするにはどうすればいいか?」という点です。定数値を使う場合はうまくいきます。実際にMikhailのクエリ例がそれを実現しています。しかし、定数の代わりに評価フィールドを使用しようとしましたが、うまくいきませんでした。この動的なブーストを前のクエリに追加するのは非常に複雑なのでしょうか?アプローチを変える必要があるのでしょうか?

よろしくお願いします。

Ned

返信投稿者:ks-solruserml-bot (2024/08/21 22:07 投稿)

q=+{!edismax qf='title^5 summary' v=$pq} {!parent which='parent:true'
score=max v=$favorsAU}&pq=great&favorsAU=#parent:false
{!func}product(field(rating),query($AU,1))&AU=country:AU^=2

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2024/08/21 22:08 投稿)

こんにちは Mikhail、

ご回答いただきありがとうございます。私たちはこの方法でうまく動作させることができませんでしたが、おっしゃった戦略を理解し、それがSolrをより深く理解する助けとなりました。実際、私たちは最初に求めていたこととは完全に一致しないものの、類似したクエリを作成することができました。これにより、子ドキュメントを考慮して動的に結果をブーストすることができました。他の開発者にとっても興味深いかもしれないので、ここにそのクエリを貼り付けておきます。

q=+{!edismax qf='title^5 description' v='great'} {!parent which='parent:true' score=max v=$q1}
&q1={!boost b=rating score=max v=$q2}
&q2=country:AU

改めてご支援いただきありがとうございました!

Ned

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

KandaSearch

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

投稿の削除

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