gpt4 book ai didi

java - Lucene Solr 使用复杂的过滤器

转载 作者:行者123 更新时间:2023-12-01 14:19:48 25 4
gpt4 key购买 nike

我目前在为 Lucene/Solr 指定过滤器时遇到问题。我提出的每个解决方案都打破了其他解决方案。让我从一个例子开始。假设我们有以下5个文档:

  • doc1 = [类型:汽车,已售出:false,所有者:约翰]
  • doc2 = [类型:自行车,产品 ID:1,所有者:Brian]
  • doc3 = [类型:汽车,已售出:true,所有者:迈克]
  • doc4 = [类型:自行车,产品 ID:2,所有者:Josh]
  • doc5 = [类型:汽车,已售出:false,所有者:约翰]

所以我需要构造以下过滤器查询:

  1. 给我所有类型为:已售出的汽车的文档:仅 false,如果它是与汽车不同的类型,请包含在结果中。所以基本上我想要文档 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
  2. 过滤属于(类型:汽车且已售出:false)或(类型:自行车且产品 ID:1)的所有文档。因此,我将得到 1,2,5。

  3. 获取所有文件,如果类型为:Car,则只能通过已售出:false 获取,否则从车主 John、Brian、Josh 处获取文件。因此对于这个查询我应该得到 1, 2, 4, 5。

注意:您不知道文档中的所有类型。由于文档数量较少,这一点很明显。

所以我的解决方案是:

  1. (-type:Car) OR ((type:Car) AND (sold:false)。效果很好,符合预期。
  2. ((-type:Car) OR ((type:Car) AND (sold:false)) AND ((-type:Bike) OR ((type:Bike) AND (productID:1)))。此解决方案不起作用。
  3. ((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 不知何故做了一些事情。

最佳答案

好吧,要获取除已售汽车之外的任何内容,您可以使用 -(type:Car sell:true)

这可以合并到其他查询中,但是您需要小心像这样的孤独否定查询。一般来说,Lucene 不能很好地处理它们,而 Solr 也有一些奇怪的问题。特别是,A -B 读起来更像是“获取所有 A 但禁止 B”,而不是“获取所有 A 和除 B 以外的任何内容”。 A 或 -B 存在类似问题,请参阅 this question了解更多。

为了解决这个问题,您需要用一组额外的括号将否定括起来,以确保 Solr 将其理解为独立的否定查询,例如: (-(type:Car AND sell :真))

所以:

  1. -(type:Car AND sell:true) (这不会得到您所说的结果,但根据我的评论,我不太理解您所说的结果)

  2. (type:Bike AND ProductID:1) (-(type:Car AND sell:true)) (您实际上在问题描述中写了这个!)

  3. (-(类型:汽车并出售:假))所有者:(约翰·布莱恩·乔什)

关于java - Lucene Solr 使用复杂的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17709256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com