如何在一个lucene查询中查询范围和缺失?

时间:2012-10-17 15:07:14

标签: syntax solr lucene

查询:

start: [ 2012101700 TO * ] OR end: [* TO 2012101700]

会给我一个结果,即开始时间是今天之后,或者结束时间是今天之前。

此查询将为我提供缺少开头或结尾的所有记录:

 -(end: [ * TO *] OR start: [* TO *])

奇怪的包围是由于查询解析器中的奇怪,请参阅:Solr query with grouping not working

但是,我希望将这些组合起来,以便我的结果是所有记录,其结果在定义的范围内或完全丢失。这个查询不起作用,因为[* TO *]会破坏它。

(end: [ * TO 2012101700] OR start: [2012101700 TO *])
 OR -(end: [ * TO *] 
 OR start: [* TO *])

有什么建议吗?

由于

戴夫

2 个答案:

答案 0 :(得分:2)

Lucene没有很好地处理“OR NOT”风格的查询。

原因是Lucene如何存储它的数据。它没有迭代的表,只过滤掉与给定查询匹配的任何内容。我实际上必须找到文件。 “OR NOT”查询,它可以找到匹配的所有文档,并消除它们,但它找不到与之不匹配的文档,因为它没有用它来搜索它们的标准。

另一种思考方式可能是,在查询数据库时,您可能会从Select * from tablename开始,这就是您缺少的信息。一种识别一组文档的方法,类似于您正在开始的记录表。

一些实现可以使这样的工作。之一:

  • 存储实际值,占位符,用于空的开始和结束日期,而只是搜索该值。这可能是最好的选择。
  • 并且查询null开始或结束到您知道的术语查询将匹配您感兴趣的所有记录(类似于您在上面提到的其他问题中提到的查询),例如:

    (end: [ * TO 2012101700] OR start: [2012101700 TO *])
    OR (term:GuaranteedHit AND -(end: [ * TO *] 
    OR start: [* TO *]))
    

您可能需要添加一个字段来完成此操作,这可能会使第一个选项更加明智。但是,通过添加字段,您可以更直接地模拟类似数据库的结构,允许您定义一个字段,以便像表名一样使用。

或者,如果您使用SOLR的唯一键功能,您可以使用id:[* TO *]找到所有文档,或者如果您愿意从对象手动构建查询,则可以使用MatchAllDocsQuery。< / p>

此外,我不希望第二种选择表现出色。

答案 1 :(得分:1)

查询:

-(start: [ * TO 2012101700] OR end: [2012101700 TO *])

实际上相当于:

(end: [ * TO 2012101700] OR start: [2012101700 TO *])
OR -(end: [ * TO *] 
OR start: [* TO *])

[* TO *]条款是多余的,因为其他术语包括那些字段超出范围的文档,包括根本不包括范围!