我需要编写lucene query / filter来获取没有特定属性的对象。 我试过...... ISNULL:“cm:param_name”但是id不起作用。
编辑:我在方面添加了新属性,但尚未更新的对象在其列出的属性中没有它(使用节点浏览器检查)。
答案 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"