不在lucene中查询

Ted*_*ati 12 lucene indexing

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

所以我可以这样做:

country:canada not sweden
Run Code Online (Sandbox Code Playgroud)

但我无法运行如下查询:

country:not sweden
Run Code Online (Sandbox Code Playgroud)

如果这个问题有一些有效的解决方案,请你告诉我

谢谢

Jan*_*rts 30

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

*:* AND NOT country:sweden
Run Code Online (Sandbox Code Playgroud)

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


Hee*_*ain 10

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

NOT message:"warning"
Run Code Online (Sandbox Code Playgroud)

消息是搜索字段

  • 重要提示:区分大小写 (2认同)
  • 重要提示:“NOT”和字段名称区分大小写。字段值不是。 (2认同)

Sha*_*ore 5

请检查类似问题的答案.解决方案是使用MatchAllDocsQuery.


adr*_*nks 3

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

Lucene 不允许NOT作为单个术语进行查询,其原因与它不允许前缀查询的原因相同 - 要执行任一查询,引擎都必须查看每个文档以确定该文档是否命中。它必须遍历每个文档,因为它不能使用搜索词作为关键字在倒排索引(用于存储索引文档)中查找文档。

以您的案例为例:

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

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