2

我需要选择所有没有特定字段的文档,并且对一个字段具有正确的值。我试图避免使用“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);
}

但是由于某种原因,每次我尝试这个查询时,我都会得到除了一个之外没有父母的所有家庭成员!无论我最后尝试什么树结构,我都只用一个有父级的成员完成......

有人知道我做错了什么或知道找到没有一个字段的文档的更好方法吗?

我正在使用 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);
}
4

1 回答 1

1

好的,我找到了解决方案。诡计在

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

}

于 2015-05-22T13:25:35.400 回答