Java Lucene:搜索没有特定字段的文档
我需要选择所有没有特定字段的文档,并为一个字段选择正确的值。我试图避免使用“null”字符串作为null字段的值,因此lucene不会为这些文档保存这些字段 文档结构如下所示Java Lucene:搜索没有特定字段的文档,java,lucene,booleanquery,Java,Lucene,Booleanquery,我需要选择所有没有特定字段的文档,并为一个字段选择正确的值。我试图避免使用“null”字符串作为null字段的值,因此lucene不会为这些文档保存这些字段 文档结构如下所示 class familyMember { String id; String name; String parentId; // Id of familyMember object which is parent of this member } 我想要的是得到所有没有父母的家庭成员。如果你这样看的话,
class familyMember {
String id;
String name;
String parentId; // Id of familyMember object which is parent of this member
}
我想要的是得到所有没有父母的家庭成员。如果你这样看的话,让我们说树根
我尝试了很多方法,但这一种看起来是最好的方法:
if (parentId != null) {
Query parentIdQuery = new TermQuery(new Term("parentID", parentId.toString()));
booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
} else {
QueryParser queryParser = new QueryParser(LUCENE_VERSION, "parentId"), analyzer);
queryParser.setAllowLeadingWildcard(true);
Query parentIdQuery = queryParser.parse("%%");
booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST_NOT);
}
但出于某种原因,每次我尝试这个查询时,我都会得到除一个之外没有父对象的所有FamilyMembers!不管我最后尝试的是什么树结构,我最后只得到一个有父节点的成员
是否有人知道我做错了什么,或者知道查找没有一个字段的文档的更好方法
我使用booleanQuery是因为在这之后,我会检查用户是否想要更多的条件,比如让我找到所有没有父项且名称为“Bill”的成员
编辑1:
我也试过这个,但还是同样的问题
if (parentId != null) {
Query parentIdQuery = new TermQuery(new Term("parentID", parentId.toString()));
booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
} else {
Query parentIdQuery = new TermQuery(new Term("parentID", "%%"));
booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST_NOT);
}
好的,我找到了解决办法。骗局出现了
new ConstantScoreQuery(new FieldValueFilter());
解决方案:
if (parentId != null) {
Query parentIdQuery = new TermQuery(new Term("parentID", parentId.toString()));
booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
} else {
Query parentIdQuery = new ConstantScoreQuery(new FieldValueFilter("parentID", true));
booleanQuery.add(parentIdQuery, BooleanClause.Occur.MUST);
}