Indexing lucene中的非查询

Indexing lucene中的非查询,indexing,lucene,Indexing,Lucene,我不需要查询我的lucene索引。Lucene目前不仅在查询中有两个或更多术语时允许: 所以我可以这样做: country:canada not sweden 但我无法运行如下查询: country:not sweden 你能告诉我这个问题是否有有效的解决办法吗 谢谢简而言之,使用标准Lucene是不可能做到这一点的 Lucene不允许将not查询作为单个术语,原因与它不允许前缀查询相同——要执行这两种查询,引擎必须查看每个文档,以确定文档是否命中。它必须查看每个文档,因为它不能使用搜索词作

我不需要查询我的lucene索引。Lucene目前不仅在查询中有两个或更多术语时允许:

所以我可以这样做:

country:canada not sweden
但我无法运行如下查询:

country:not sweden
你能告诉我这个问题是否有有效的解决办法吗


谢谢

简而言之,使用标准Lucene是不可能做到这一点的

Lucene不允许将
not
查询作为单个术语,原因与它不允许前缀查询相同——要执行这两种查询,引擎必须查看每个文档,以确定文档是否命中。它必须查看每个文档,因为它不能使用搜索词作为键来查找反向索引中的文档(用于存储索引文档)

以您的案例为例:

要搜索
非瑞典
,最简单(可能也是最有效)的方法是搜索
瑞典
,然后“反转”结果集以返回不在该结果集中的所有文档。要做到这一点,需要在索引中找到所有必需的(即不在结果集中)文档,但没有一个键来查找它们。这将通过迭代索引中的文档来完成—这是一项未优化的任务,因此速度将受到影响


如果您确实需要此功能,您可以在编制索引时维护自己的项目列表,以便
非瑞典
搜索使用Lucene变成
瑞典
搜索,然后使用您的项目集反转结果。

请检查类似答案。解决方法是使用。

非常晚的回复,但它可能对以后的其他人有用:

*:* AND NOT country:sweden

如果我没有弄错的话,这应该对所有文件和与“瑞典”不同的国家的文件进行逻辑“和”。

好的,我明白你在想什么了

您可以将其用作查询优化,因为Lucene中没有一元布尔运算符。尽管有上述答案,但我相信这是一种更好、最具前瞻性的方法(注意通配符前面的空格):


在搜索框中尝试以下查询:

NOT message:"warning"

消息作为搜索字段

我一直在挣扎,因为lucene StandardQueryParser没有正确解析这个“-国家:瑞典”。显然,解析器将其转换为“国家:瑞典”。这个评论为我澄清了一个常见的用例。重要提示:它区分大小写重要:“NOT”和字段名区分大小写。字段值不正确。
NOT message:"warning"