我目前在为 Lucene/Solr 指定过滤器时遇到问题。我提出的每个解决方案都会破坏其他解决方案。让我从一个例子开始。假设我们有以下 5 个文档:
- doc1 = [类型:汽车,售出:假,所有者:约翰]
- doc2 = [类型:自行车,产品 ID:1,所有者:布赖恩]
- doc3 = [类型:汽车,已售:真实,所有者:迈克]
- doc4 = [类型:自行车,productID:2,所有者:Josh]
- doc5 = [类型:汽车,售出:假,所有者:约翰]
所以我需要构造以下过滤查询:
给我所有类型的文件:Car which has sold:false only,如果它是与 Car 不同的类型,则包括在结果中。所以基本上我想要文档 1、2、4、5,我唯一不想要的文档是 doc3,因为它已售出:true。更准确地说:
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。
- 获取类型为:Car 的所有文件,然后仅使用已售出: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))。这行不通,我可以如果我这样做,它会起作用: ((owner:John) OR (owner:Brian) OR (owner:Josh)) AND (( version :* OR (-type:Car)) OR ((type:Car) AND (sold:false)). 我不明白这是如何工作的,因为从逻辑上讲它应该工作,但 Solr/Lucene 不知何故做了一些事情。