【问题标题】:Lucene not null query?Lucene不是空查询?
【发布时间】:2011-03-21 22:20:06
【问题描述】:

我们如何构造一个查询来搜索不为空的特定字段?

field_name:* 不工作。 我试过field_name:[a* to z*] 这对英语很好,但不涵盖所有语言。

还有其他建议吗?

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    我发现这在某些情况下可以工作 field:([0 TO 9] [a TO z])

    【讨论】:

    • 在这种情况下,我宁愿:field:([0 TO 9] [a TO z] [A TO Z]) 也获得首字母大写
    【解决方案2】:

    对于迟到问题的其他人,documentation 包括这个小 sn-p:

    • 其中字段title 具有任何非空值:
      _exists_:title

    【讨论】:

      【解决方案3】:

      试试field:[* TO *]field:["" TO *]。不过最好使用过滤器。

      【讨论】:

      • 后者适用于我的 lucene 版本 6.6.1,es 版本 5.6.8。
      【解决方案4】:

      Lucene 目前不支持此功能。请参阅this 进行讨论。

      另一种选择可能是将一些预定义的字符串(如nullnullnullnull)存储为字段值(如果它为空)。然后您可以使用否定过滤器来删除这些记录。 (我不太喜欢这个,但想不出更好的选择)

      【讨论】:

      • 这个答案已经过时,因为 Lucene 引入了 FieldValueQuery。请参考下面我的回答
      【解决方案5】:

      我遇到了同样的问题,但是您可以在查询解析器上设置一个属性,让您在搜索词的开头使用通配符。

      queryParser.setAllowLeadingWildcard(true);
      

      这解决了我的问题

      请看Wildcard at the Beginning of a searchterm -Lucene

      【讨论】:

        【解决方案6】:

        在当前的 Lucene 版本中,FieldValueQuery 已过时。 目前您可以使用:

        new DocValuesFieldExistsQuery(name)
        

        这仅适用于 SortedDocValuesFields,因此您必须在创建文档时添加它们。

        doc.add(new SortedDocValuesField(name, new BytesRef(value));
        doc.add(new StringField(name, value, Field.Store.Yes)); //optional
        

        第二行使您能够检索值(DocValuesFields 的值不能被读取为字符串)。
        请注意,lucene 允许与上述示例中具有相同名称的多个字段。

        【讨论】:

          【解决方案7】:

          看看 org.apache.lucene.search.FieldValueQuery

          A Query that matches documents that have a value for a given field as reported by LeafReader#getDocsWithField(String).

          请注意,它仅适用于 DocValues,因此您需要更改创建文档的方式:

          document.add(new StringField("field-name", "field-value", Field.Store.YES));
          document.add(new SortedDocValuesField("field-name", new BytesRef("field-value")));
          

          在这里我添加了两个字段——你仍然需要常规的 StringField 来获得价值。对于旧版本的 Lucene,您可以选择使用 BinaryDocValues#get(),但正如我所见,它已在 v7 中删除。不确定,现在检索值的正确方法是什么 - 请检查this

          【讨论】:

            【解决方案8】:

            我刚刚开始使用 lucene(通过 logstash 弹性搜索),发现这似乎可以在 kibana UI 中使用。我还不确定这是否是弹性搜索或 kibana 中的一些智能,我只知道弹性搜索借用了 lucene 语法。

            application:unit-test && !exception
            

            将返回我的单元测试中没有异常的所有结果

            application:unit-test && exception
            

            返回那些索引了非空异常的那些。所以你可以试试

            field
            

            !field
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-08-06
              • 2011-04-06
              • 1970-01-01
              • 1970-01-01
              • 2010-11-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多