0

查询:

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 *])

有什么建议么?

谢谢

戴夫

4

2 回答 2

3

Lucene 不能很好地处理“OR NOT”样式的查询。

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

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

几个实现可以使这样的工作。任何一个:

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

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

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

或者,如果您使用 SOLR 的 uniquekey 功能,您可以使用id:[* TO *]查找所有文档,或者如果您愿意从对象手动构建查询,您可以使用MatchAllDocsQuery

另外,我不希望第二个选项有出色的表现。

于 2012-10-17T17:37:19.720 回答
1

查询:

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

实际上相当于:

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

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

于 2012-10-18T09:58:33.460 回答