現在、Lucene/Solr のフィルターの指定に問題があります。私が思いつく解決策はすべて、他の解決策を壊します。例から始めましょう。次の 5 つのドキュメントがあるとします。
- doc1 = [タイプ:車、販売:偽、所有者:ジョン]
- doc2 = [タイプ: 自転車、商品 ID:1、所有者: ブライアン]
- doc3 = [タイプ:車、販売:真、所有者:マイク]
- doc4 = [タイプ: 自転車、商品 ID:2、所有者: ジョシュ]
- doc5 = [タイプ:車、販売:偽、所有者:ジョン]
したがって、次のフィルター クエリを作成する必要があります。
sales:false のみを持つ type:Car のすべてのドキュメントを教えてください。それが Car とは異なるタイプである場合は、結果に含めてください。したがって、基本的にはドキュメント 1、2、4、5 が必要です。不要なドキュメントは doc3 だけです。より正確に言えば:
for each document d in solr/lucene if d.type == Car { if d.sold == false, then add to result else ignore } else { add to result } return result
(type:Car and sold:false) または (type:Bike and productID:1) のすべてのドキュメントをフィルター処理します。したがって、これについては 1,2,5 を取得します。
- type:Car の場合は、sold:false でのみ取得するすべてのドキュメントを取得します。それ以外の場合は、所有者の John、Brian、Josh からドキュメントを取得します。したがって、このクエリでは、1、2、4、5 を取得する必要があります。
注:ドキュメント内のすべてのタイプを把握しているわけではありません。ここでは、ドキュメントの数が少ないため明らかです。
したがって、私の解決策は次のとおりです。
- (-type:Car) OR ((type:Car) AND (sold:false) これは正常に機能し、期待どおりに機能します。
- ((-type:Car) OR ((type:Car) AND (sold:false)) AND ((-type:Bike) OR ((type:Bike) AND (productID:1))) このソリューションは機能しません.
- ((owner:John) OR (owner:Brian) OR (owner:Josh)) AND ((-type:Car) OR ((type:Car) AND (sold:false)). これはうまくいきません。これを行うと機能します: ((所有者:ジョン) OR (所有者:ブライアン) OR (所有者:ジョシュ)) AND ((バージョン:* OR (-タイプ:車)) OR ((タイプ:車) AND (sold:false)). 論理的には機能するはずなので、これがどのように機能するのかわかりませんが、Solr/Lucene は何らかの形で機能します。