【发布时间】:2011-03-21 22:20:06
【问题描述】:
我们如何构造一个查询来搜索不为空的特定字段?
field_name:* 不工作。
我试过field_name:[a* to z*] 这对英语很好,但不涵盖所有语言。
还有其他建议吗?
【问题讨论】:
我们如何构造一个查询来搜索不为空的特定字段?
field_name:* 不工作。
我试过field_name:[a* to z*] 这对英语很好,但不涵盖所有语言。
还有其他建议吗?
【问题讨论】:
我发现这在某些情况下可以工作 field:([0 TO 9] [a TO z])
【讨论】:
field:([0 TO 9] [a TO z] [A TO Z]) 也获得首字母大写
对于迟到问题的其他人,documentation 包括这个小 sn-p:
title 具有任何非空值:_exists_:title
【讨论】:
试试field:[* TO *] 或field:["" TO *]。不过最好使用过滤器。
【讨论】:
Lucene 目前不支持此功能。请参阅this 进行讨论。
另一种选择可能是将一些预定义的字符串(如nullnullnullnull)存储为字段值(如果它为空)。然后您可以使用否定过滤器来删除这些记录。 (我不太喜欢这个,但想不出更好的选择)
【讨论】:
我遇到了同样的问题,但是您可以在查询解析器上设置一个属性,让您在搜索词的开头使用通配符。
queryParser.setAllowLeadingWildcard(true);
这解决了我的问题
【讨论】:
在当前的 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 允许与上述示例中具有相同名称的多个字段。
【讨论】:
看看 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
【讨论】:
我刚刚开始使用 lucene(通过 logstash 弹性搜索),发现这似乎可以在 kibana UI 中使用。我还不确定这是否是弹性搜索或 kibana 中的一些智能,我只知道弹性搜索借用了 lucene 语法。
application:unit-test && !exception
将返回我的单元测试中没有异常的所有结果
application:unit-test && exception
返回那些索引了非空异常的那些。所以你可以试试
field
或
!field
【讨论】: