AND NOT与AND(NOT)一起查询

时间:2014-05-06 05:51:32

标签: php lucene

我正在尝试构建满足condition1和condition2的查询。这里,condition2本身就是一种子查询。

CID:1234 AND (NOT FIELD2: STR)
CID:1234 AND NOT FIELD2: STR

在上面的第二个查询中,行为符合预期但第一个查询不行。您可能会告诉我删除大括号,但正如我所说,condition2是子查询,它也可能是:

CID:1234 AND (NOT FIELD2: STR AND (FIELD3: ABC OR FIELD4: XYZ))

条件2是动态的。它可能只有NOT子句或者可能有更多。

需要查询:给所有具有CID 1234的文档,并且它还满足以下内容: 1)FIELD1不等于STR且FIELD2不等于STR2的文档,

1 个答案:

答案 0 :(得分:0)

问题源于对lucene查询如何工作的基本误解。

SQL查询意味着完整的结果表的起点,然后对其进行过滤。 Lucene查询没有。您从没有结果开始,并通过提供的查询找到它们。

NOT FIELD2:STR表示:禁止FIELD2:STRNothing禁止Something仍然没有。除了FIELD2:STR之外,意味着获得所有内容。这类似于*:* -FIELD2:STR,其中*:*MatchAllDocsQuery(注意:lucene查询解析器不支持*:*。Solr确实如此,Lucene不支持SHOULD。您可以支持这种查询构造,但它通常是不可取的,因为它需要枚举索引中的整个文档集,这可能导致性能非常差。

Lucene的+/-语法比令人困惑的AND / OR / NOT语法更加清晰和灵活。 +/-是如何构造lucene查询(lucene术语使用标签MUSTMUST_NOT和{{1}})。 AND / OR / NOT被解释为这些术语,解释不完美,导致这样的混乱问题。

有关该主题的进一步阅读:Why Not AND, OR, and NOT?