我们如何构建查询以搜索特定字段为非空?
field_name:*
无效。
我试过field_name:[a* to z*]
这适用于英语,但不包括所有语言。
任何其他建议?
答案 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);
这解决了我的问题
答案 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