带有过滤器“无属性”的 Lucene 查询

问题描述 投票:0回答:6

我需要编写 lucene 查询/过滤器来获取没有特定属性的对象。 我尝试使用 ... ISNULL:"cm:param_name" 但 id 不起作用。

编辑:我在方面添加了新属性,但尚未更新的对象在其列出的属性中还没有它(使用节点浏览器检查)。

lucene alfresco alfresco-share
6个回答
1
投票

使用“cm:*”这样的查询,您应该只收到包含字段“cm”加上内容的文档。请注意,您必须使用 setAllowLeadingWildcard(true) 允许查询解析器进行前导通配符查询。

另请查看这篇文章,它处理您问题的相反版本: 查找所有具有某个字段的 Lucene 文档


0
投票

您能更清楚地了解“没有财产”是什么意思吗?您的意思是您不想像“field:value”这样指定字段,而是将过滤器设置为“value”?

编辑

您是动态生成这些字段名称还是这是唯一可能缺少其值的字段名称?如果只有一个字段可能会或可能不会出现在您的文档中,那么您可以在缺少该字段时使用默认值填充该字段,然后搜索该字段。否则,您可以尝试使用否定范围查询,如下所示: NOT foo:[* TO *] 。这应该匹配 foo 字段中没有值的所有文档。出于性能目的,在第二种情况下,该字段应作为字符串字段进行索引(不进行分析)。


0
投票

我设法用 .. AND NOT (@namespace\:property:"") 完成了这个工作


0
投票

在 Java 和 Lucene 3.6.2 中,可以使用带有激活否定的“FieldValueFilter”:(这不是问题)

import org.apache.lucene.search.FieldValueFilter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.TopDocs;

final IndexSearcher indexSearcher = getIndexSearcher() <- whereever that comes from
final TopDocs topdocs = indexSearcher.search(new MatchAllDocsQuery(), new FieldValueFilter("cm", true), Integer.MAX_VALUE);

0
投票

对于这种情况,您可以使用 ISUNSET 和/或 ISNULL。

ISUNSET:"cm:title"
ISNULL:"cm:title"

0
投票

这对我有用:

-_exists_:field_name

摘自这里

© www.soinside.com 2019 - 2024. All rights reserved.