【问题标题】:Lucene: Search for documents that dont have specific fieldLucene:搜索没有特定字段的文档
【发布时间】:2015-08-04 10:52:08
【问题描述】:

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

【问题讨论】:

    标签: java lucene booleanquery


    【解决方案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);
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多