gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:11:00 26 4
gpt4 key购买 nike

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

文档结构如下所示

class familyMember {
String id;
String name;
String parentId; // Id of familyMember object which is parent of this member
}

我想要的是得到所有没有 parent 的家庭成员。如果你这样看的话,我们可以说树的根。

我尝试了很多方法,但这个看起来是最好的方法:

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

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

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

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

}

关于java - Lucene:搜索没有特定字段的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30396298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com