なぜクエリ内のORが時々機能しないのですか?

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

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

こんにちは、

次のクエリに何か問題があるのでしょうか?
私のSolrクエリは以下の通りです:

{
  "query": X,
  "sort": "prodAllGeneric_txt_sort asc"
}

(注意:prodAllGeneric_txt_sortはフィールド、Xはクエリの詳細です)

もしXが "(prodAllGeneric_txt_sort:"Phi; ")" であれば、Solrは3つのドキュメントを見つけます。
もしXが "(-prodAllGeneric_txt_sort:)" であれば、Solrは8つのドキュメントを見つけます。
もしXが "(prodAllGeneric_txt_sort:"Phi; ") OR (-prodAllGeneric_txt_sort:
)" であれば、Solrは3つのドキュメントしか見つけられません。
何が問題なのでしょうか?私はSolrが11つのドキュメントを見つけるはずだと思っていますが、この場合ORが機能していないようです。

次に少し変更を加えます。
もしXが "(prodAllGeneric_txt_sort:"Phi; ")" であれば、Solrは3つのドキュメントを見つけます。
もしXが "(prodAllGeneric_txt_sort:"Chi; ")" であれば、Solrは9つのドキュメントを見つけます。
もしXが "(prodAllGeneric_txt_sort:"Phi; ") OR (prodAllGeneric_txt_sort:"Chi; ")" であれば、Solrは12つのドキュメントを見つけます。
この場合はORが機能しているようです。

どうもありがとうございます。

Zhiqing

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

ドキュメントを見て、どのドキュメントがヒットして返されているかを確認する必要があります。
もしフィールドのないドキュメントがあれば、それが8つのドキュメントになるかもしれません。
もし'Phi'という値を持つドキュメントが3つあれば、それが3つのドキュメントになります。
一度ポジティブな条件があると、否定条件でそのドキュメントを除外することしかできませんので、それが3つのドキュメントになります。

しかし、どのドキュメントIDが返されているか、どのフィールドがそれらに対して使用されているかを見て、クエリの結果を逆解析することが重要です。

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

Luceneクエリの構文のちょっとした特異性にぶつかっていますね。その特異性は、純粋に否定的なクエリを実際には実行できないことです。

あなたの中間のクエリが動作するのは、Solrがその実行不可能なクエリを検出して裏側で修正できるからです。もし直接Luceneにそのクエリを提供した場合、おそらく動作しないでしょう。三番目のクエリはSolrにとって問題を検出するのが複雑すぎます。

そのような構文を使用すると、Luceneに対してドキュメントを結果セットから差し引くことを指示しています。つまり、あなたの三番目のクエリが平易な言葉で解析されるとすれば:

「このフィールドで特定の文字列に一致するすべてのドキュメントを始め、このフィールドが存在するすべてのドキュメントを差し引く。」そのため、最初に3つのドキュメントが始まります。なぜなら、クエリの第二節は差し引きですから。

また、ワイルドカードクエリを使用することで極端な非効率性も生じています。レンジクエリの方がはるかに効率的です。

あなたができる限り効率よく望む結果を得るために送信すべきクエリは次の通りです(引用符のエスケープは貼り付けたものから除外しています):

prodAllGeneric_txt_sort:"Phi; " OR (*:* -prodAllGeneric_txt_sort:[* TO *])

最初の節には不要な括弧が含まれていないため、それらはこの構文では不要です。もし実際のクエリがもっと複雑な場合は、再度括弧を追加する必要があるかもしれません。

ありがとうございます。
Shawn

返信投稿者:ks-solruserml-bot (2024/06/26 20:23 投稿)

Shawn さん、Timさん、
以下の行が私の問題を解決しました。

prodAllGeneric_txt_sort:"Phi; " OR (: -prodAllGeneric_txt_sort:[* TO *])

さらに、説明が非常に役立ちました。
ありがとうございます。
Zhiqing

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

KandaSearch

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

投稿の削除

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