Java 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 } 我想要的是得到所有没有父母的家庭成员。如果你这样看的话,

我需要选择所有没有特定字段的文档,并为一个字段选择正确的值。我试图避免使用“null”字符串作为null字段的值,因此lucene不会为这些文档保存这些字段

文档结构如下所示

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);
}