Lucene は「OR NOT」スタイルのクエリをうまく処理しません。
その理由は、Lucene がデータを保存する方法にあります。反復するテーブルがなく、指定されたクエリに一致するものをすべて除外するだけです。私は実際に文書を見つけなければなりません。「OR NOT」クエリでは、一致するすべてのドキュメントを検索して除外できますが、一致しないドキュメントを検索する基準がないため、検索できません。
それについて考える別の方法は、データベースにクエリを実行するときに から始めることができSelect * from tablename
、それが不足している情報です。レコードのテーブルに似た一連のドキュメントを識別する方法。
いくつかの実装により、このようなものが機能する可能性があります。また:
- null の開始日と終了日に対して実際の値、プレースホルダーを保存し、代わりにその値を検索します。これはおそらく最良の選択肢です。
AND null start または null end のクエリは、次のように、関心のあるすべてのレコードに一致することがわかっている用語クエリ (上記の他の質問で得たクエリと同様) に一致します。
(end: [ * TO 2012101700] OR start: [2012101700 TO *])
OR (term:GuaranteedHit AND -(end: [ * TO *]
OR start: [* TO *]))
これを実現するには、フィールドを追加する必要がある場合があります。これにより、最初のオプションがより適切になる場合があります。ただし、フィールドを追加すると、テーブル名のように使用するフィールドを定義できるため、データベースのような構造をより直接的にエミュレートできます。
または、SOLR の uniquekey 機能を使用する場合は、すべてのドキュメントを検索するか、オブジェクトからクエリを手動で作成する場合は、 MatchAllDocsQueryid:[* TO *]
を使用できます。
また、この 2 番目のオプションに優れたパフォーマンスは期待できません。