86

次のようなsolrクエリに取り組んでいます。

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

これを実行すると、結果は返されません。OR NOT のどちらかの側で条件を使用すると、期待どおりの結果が返されます。それらはうまく連携していません。myFieldがsuperneatに一致する場合、myOtherFieldがsomethingElseに設定されていることも確認するつもりですが、 myFieldがsuperneatでない場合は結果に含めます。

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

4

7 に答える 7

84

なぜうまくいかないのかわかりませんが、これは論理的に同等であり、うまくいきます

-(myField:superneat AND -myOtherField:somethingElse)

おそらく、クエリで同じフィールドを2回定義することに関係があります...

solr-user groupで質問してみて、最終的な回答をここに投稿してください!

于 2009-03-11T15:41:47.530 に答える
44
Instead of "NOT [condition]" use "(*:* NOT [condition])"
于 2009-08-21T20:20:59.897 に答える
35

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

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

大きな注意点は、Solr はトップレベルのクエリが純粋な否定クエリであるかどうかのみをチェックすることです! したがって、これはbar OR (-foo)、純粋な否定クエリが最上位クエリのサブ句にあるため、クエリのようなものは変更されないことを意味します。このクエリを自分で変換する必要がありますbar OR (*:* -foo)

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

?q=-title:foo&debug=query

に変換されます

(+(-title:foo +MatchAllDocsQuery(*:*))
于 2014-01-28T15:01:17.113 に答える
25

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

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

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

これはsolr 4.1.0で機能します。これは、OP の使用例とは少し異なります。しかし、他の人はそれが役立つと思うと思いました。

于 2014-03-24T17:34:49.910 に答える
10

solr-user グループのフォローアップは、 solr user mailling listにあります。

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

于 2009-03-13T12:27:55.390 に答える