web-dev-qa-db-ja.com

solrクエリでORおよびNOTを使用

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

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

これを実行すると、結果は返されません。 OR NOTのどちらかの側で基準を使用すると、期待する結果が返されます-うまく機能していないだけです。myFieldが一致する場合superneatmyOtherFieldsomethingElseに設定されていることを確認するつもりですが、myFieldsuperneatではなく、結果に含めます。

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

81
stolenricecakes

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

-(myField:superneat AND -myOtherField:somethingElse)

たぶん、クエリで同じフィールドを2回定義することと関係があるかもしれません...

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

82
Instead of "NOT [condition]" use "(*:* NOT [condition])"
39
MVMn

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

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

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

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

_?q=-title:foo&debug=query
_

に変換されます

_(+(-title:foo +MatchAllDocsQuery(*:*))
_
33
Yonik

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

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

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

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

23
RMorrisey

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

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

8
stolenricecakes

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

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

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

another*:*これを機能させるためのor条件の後、次のようになります。

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

編集:これはsolr 6.6.3にあります

3
demonllama