2014-05-06 303 views
0

我试图建立一个满足条件1和条件2的查询。这里condition2本身就是一种子查询。AND NOT(AND)(NOT)together in query

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

在上述第二个查询中的行为与预期的相反,但第一个查询不行。你可能会告诉我删除括号,但正如我所说的条件2为一个子查询,也可以是:

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

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

查询:给具有CID 1234的所有文档和它也满足下列在一起: 1)文档与FIELD1不等于STR和FIELD2不等于STR2,

回答

0

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

SQL查询意味着整个结果表的起点,然后将其过滤掉。 Lucene查询没有。你从没有结果开始,并通过提供的查询找到它们。

NOT FIELD2:STR表示:禁止FIELD2:STRNothing禁止Something仍然没有。它确实是而不是的意思是获得一切,但是FIELD2:STR。这将是类似于*:* -FIELD2:STR,其中*:*MatchAllDocsQuery(注意:lucene查询解析器不支持*:*。Solr,Lucene不)。您可以支持这种查询构造,但它通常是不可取的,因为它要求枚举索引中的整个文档集合,这可能会导致性能很差。

Lucene的+/-语法比混淆AND/OR/NOT语法要清晰灵活得多。 +/-是如何构建lucene查询(lucene术语使用标签SHOULDMUSTMUST_NOT)。和/或/不会被解释为这些条款,并且解释是不完美的并导致这样的混淆问题。

如需进一步阅读该主题:Why Not AND, OR, and NOT?

相关问题