Lucene不是null查询?

时间:2011-03-21 22:20:06

标签: java lucene

我们如何构建查询以搜索特定字段为非空?

field_name:*无效。 我试过field_name:[a* to z*]这适用于英语,但不包括所有语言。

任何其他建议?

8 个答案:

答案 0 :(得分:14)

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

可以使用此功能

答案 1 :(得分:4)

Lucene目前不支持此功能。有关讨论,请参阅this

替代选项可以是将一些预定义的字符串(如nullnullnullnull)存储为字段值(如果它为null)。然后,您可以使用负过滤器删除这些记录。 (我不喜欢这么多,但想不出更好的选择)

答案 2 :(得分:3)

尝试field:[* TO *]field:["" TO *]。但是,尽管使用过滤器可能更好。

答案 3 :(得分:3)

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

queryParser.setAllowLeadingWildcard(true);

这解决了我的问题

请参阅Wildcard at the Beginning of a searchterm -Lucene

答案 4 :(得分:3)

对于迟到问题的其他人,documentation包含以下小片段:

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

答案 5 :(得分:0)

看看 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

答案 6 :(得分:0)

在当前的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 :(得分:-1)

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

application:unit-test && !exception

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

application:unit-test && exception

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

field

!field