solrクエリでORとNOTを使用する


83

私は次のようなSolrクエリに取り組んでいます:

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

これを実行すると、結果は返されません。OR NOTのいずれかの側で基準を使用すると、期待どおりの結果が返されます。これらは、一緒にうまく機能していないだけです。場合にはmyFieldでは一致したsuperneatを、私はまたことを保証することを意図していmyOtherFieldがに設定されているsomethingElseが、場合myFieldではないsuperneat、結果に含めます。

solrがこの種のクエリの結果を返さない理由を誰かが説明できますか?クエリを何らかの方法で再構築する必要がありますか?それとも、solrを使用して目的の結果を達成するための別の方法がありますか?

回答:


82

なぜそれが機能しないのかわかりませんが、これは論理的に同等であり、機能します:

-(myField:superneat AND -myOtherField:somethingElse)

多分それはクエリで同じフィールドを2回定義することと関係があります...

solr-userグループで質問してから、ここに最終的な回答を投稿してください。


ご協力ありがとうございました!これは確かに機能します-そして私はこれをsolr-userグループに提示しました。彼らから聞いた役に立つことをここに投稿します。
stolenricecakes 2009年

8
これ-myField:superneat OR myOtherField:somethingElseも同じで、少し単純であることに注意してください。
Yorick Sijsling 2011年

3
@YorickSijslingの要点は、論理的には同等であっても、Solrは、OPが投稿したクエリやあなたが投稿したクエリのような純粋に否定的なクエリにうまく対処できない場合があるということです。
Mauricio Scheffer 2012

@ MauricioScheffer-私はそれを完全に疑問視します。うまく対応できないことについて詳しく教えてください。ここではかなり複雑な条件を実行し、何十億ものドキュメントに非常にうまく対応していることがわかりました。
terrance.a.snyder 2012

@ terrance.a.snyder "複雑な条件"!= "純粋に否定的なクエリ"。また、最近のバージョンのSolrでは状況が改善されている可能性がありますが、確認していません。
Mauricio Scheffer 2012

42
Instead of "NOT [condition]" use "(*:* NOT [condition])"

1
どうもありがとう!これは、複雑なクエリでも機能しましたが、-(myField:superneat AND -myOtherField:somethingElse)アプローチでは機能しませんでした。
dpetruha 2013

33

Solrは現在、「純粋なネガティブ」クエリをチェックし、*:*正しく機能するように(すべてのドキュメントに一致する)挿入します。

-foo solrによってに変換されます (*:* -foo)

大きな注意点は、Solrがトップレベルのクエリが純粋なネガティブクエリであるかどうかを確認するだけであるということです。つまり、これはbar OR (-foo)、純粋なネガティブクエリが最上位クエリの副節にあるため、のようなクエリは変更されないことを意味します。このクエリを自分で変換する必要がありますbar OR (*:* -foo)

solrクエリの説明を確認して、クエリの変換を確認できます。

?q=-title:foo&debug=query

に変換されます

(+(-title:foo +MatchAllDocsQuery(*:*))

1
edismaxは、ネストされた純粋な否定クエリを正しく処理しますよね?同じ方法でこれらをサポートするためにLuceneクエリパーサーにパッチを適用することについての議論はありましたか?
ピーターディクソン-モーゼス

24

ここで、Solrのドキュメントと他のSOの質問について、いくつかの異なる回答からのコメントをまとめると、次の構文が私のユースケースに対して正しい結果を生成することがわかりました。

(my_field = my_valueまたはmy_fieldがnull):

(my_field:"my_value" OR (*:* NOT my_field:*))

これはsolr4.1.0で機能します。これは、OPのユースケースとは少し異なります。しかし、私は他の人がそれが役に立つと思うだろうと思いました。


1
今日、Solr 5でまさにこのシナリオに遭遇し、この提案は機能します。
ライアンシェリー

9

solr-userグループへのフォローアップは次の場所にあります: solr user mailling list

NOT演算子は、データセット全体から結果を除外するだけでなく、クエリから結果を削除するためにのみ使用できるというのが一般的な考え方です。私はあなたがmauschを提案した構文が好きです-ありがとう!


3

別の予期しないケースを追加するために、期待される結果を返さなかったクエリを次に示します。

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_b私の場合、ファセットを実行するものであり、そのタイプ(バー)でのみクエリ用語「foo」をターゲットにする必要がありました。

これを機能させるには、or条件の後に別の *:*条件を挿入する必要がありました。

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

編集:これはsolr6.6.3にあります


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.