【问题标题】:not query in lucene不在lucene中查询
【发布时间】:2011-04-06 00:12:20
【问题描述】:

我不需要查询我的 lucene 索引。 Lucene 目前不仅允许查询中有两个或多个词条:

所以我可以这样做:

country:canada not sweden

但我无法运行如下查询:

country:not sweden

能否请您告诉我是否有针对此问题的有效解决方案

谢谢

【问题讨论】:

    标签: indexing lucene


    【解决方案1】:

    简短的回答是使用标准的 Lucene 是不可能的。

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

    以你的情况为例:

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

    如果你真的需要这个功能,你可以在索引时维护你自己的项目列表,这样not sweden 搜索变成使用 Lucene 的 sweden 搜索,然后使用你的项目集反转结果。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        *:* AND NOT country:sweden
        

        如果我没记错的话,这应该对所有文件以及国家/地区与“瑞典”不同的文件进行逻辑“与”。

        【讨论】:

        • 我很挣扎,因为 lucene StandardQueryParser 没有正确解析这个“-country:sweden”。显然解析器将其转换为“国家:瑞典”。这条评论为我阐明了一个常见的用例。
        【解决方案4】:

        好的,我明白你在做什么。

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

        &query= *&qf=-country:Canada
        

        【讨论】:

          【解决方案5】:

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

          NOT message:"warning"
          

          message 是搜索字段

          【讨论】:

          • 重要:区分大小写
          • 重要提示:“NOT”和字段名区分大小写。字段值不是。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-29
          • 1970-01-01
          • 2010-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多