Lucene:搜索没有特定字段的文档

时间:2015-05-22 12:07:01

标签: java lucene booleanquery

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

但出于某种原因,每次我尝试这个查询时,我都会得到所有没有父母的家庭成员!无论我在最后尝试什么树结构,我只有 ONE 成员才有父母......

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

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

1 个答案:

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

}

相关问题