6

次のフィルター クエリは、結果を返しません (*:* をクエリとして使用)。

-startDate:[* TO *] OR startDate:[* TO NOW/DAY+1DAY]

しかし、次の条件のみでフィルタリングした場合:

-startDate:[* TO *]

3 つの結果が得られます。

のみでフィルタリングする場合:

startDate:[* TO NOW/DAY+1DAY]

161件の結果が得られました。

結合された FQ がゼロの結果を返すのはなぜですか? 私が欲しいのは、開始日が null または開始日が今日より前のドキュメントを返すフィルターです。

編集:

Solr 4.2.1.2013.03.26.08.26.55 を使用しています

編集:

奇妙に聞こえるかもしれませんが、同僚が次のように 2 つの部分に括弧を付けることを提案しました。

(-startDate:[* TO *]) OR (startDate:[* TO NOW/DAY+1DAY])

そして、どういうわけかそれはうまくいきました。なぜそれが違いを生んだのか、私はまだ興味があります。誰かが光を当てることができることを願っています。

ありがとう!

4

4 に答える 4

6

Solr は純粋な否定クエリをサポートしています。彼らは、基本的に、純粋な否定を次のようなものに拡張することによってこれを行います。

*:* -startDate:[* TO *]

ただし、それを BooleanQuery に組み合わせると、この種のロジックが適用されるとは思えません。lucene では、ネガティブ クエリは何も取得しませんが、他のポジティブ クエリ タームによって取り込まれた一致を除外します。*:*これは、ある意味で暗黙の 、または結果の完全なテーブルで始まり、それを切り詰めることができるSQL クエリとは異なります。

OR厳密に言えば、文脈上意味をなさないので、あなたは事実上無視されていると思います。一般に、ORは単なる構文糖衣であると私は信じています (field:this OR field:thatは と同等ですfield:this field:that)。

したがって、実際にはクエリは: startDate:[* TO NOW/DAY+1DAY] -startDate:[* TO *]であり、結果がより明確になります。solr括弧で囲むと、各ターム クエリが個別に処理され、の孤独な否定クエリのサポートにアクセスできるようになります。


未設定/null 値を検索する必要がある場合は、デフォルト値を保存することをお勧めします。*:*さらに、このような純粋な否定クエリは、インデックス全体をスキャンする必要があるため、パフォーマンスが非常に低下します。デフォルト値を指定すると、パフォーマンスが向上し、この種の紛らわしい状況を防ぐことができます。

于 2013-06-20T23:32:31.973 に答える
-1

純粋な否定クエリは、何も結果を省略しているため、機能しません。

試す:

: AND -startDate:[* TO *]

于 2013-06-20T19:08:27.793 に答える
-1

クエリを実行する-startDate:[* TO *]と、フィールドのデータを持たないドキュメントが取得されstartDateます。

クエリを実行すると、フィールド内のstartDate:[* TO NOW/DAY+1DAY]値以下のドキュメントが取得されます。NOW/DAY+1DAYstartDate

あなたは試すことができ-startDate:* OR startDate:[* TO NOW/DAY+1DAY]ます。NOW/DAY+1DAY最初の部分は値を持たないドキュメントを示し、2 番目の部分はフィールド内の値以下の値を持つドキュメントを示しstartDateます。

于 2013-06-20T19:08:47.730 に答える