Lucene查询带过滤器"没有属性"

时间:2014-06-17 08:22:53

标签: lucene alfresco alfresco-share

我需要编写lucene query / filter来获取没有特定属性的对象。 我试过...... ISNULL:“cm:param_name”但是id不起作用。

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

5 个答案:

答案 0 :(得分:1)

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

另请查看此帖子,该帖子处理问题的反转版本: Find all Lucene documents having a certain field

答案 1 :(得分:0)

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

修改

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

答案 2 :(得分:0)

我设法完成了这个...而不是(@namespace \:property:“”)

答案 3 :(得分: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);

答案 4 :(得分:0)

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

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