Lucene:搜索没有特定字段的文档
Lucene: Search for documents that dont have specific field
我需要 select 所有没有特定字段但有一个字段具有正确值的文档。我试图避免使用 "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,只有一个除外!无论我最后尝试什么树结构,我都只用 ONE 成员完成,它有一个 parent...
有人知道我做错了什么或知道查找没有一个字段的文档的更好方法吗?
我正在使用 booleanQuery,因为在此之后我会检查用户是否需要更多条件,比如让我找到所有没有 parent 且名称如 "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);
}
我需要 select 所有没有特定字段但有一个字段具有正确值的文档。我试图避免使用 "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,只有一个除外!无论我最后尝试什么树结构,我都只用 ONE 成员完成,它有一个 parent...
有人知道我做错了什么或知道查找没有一个字段的文档的更好方法吗?
我正在使用 booleanQuery,因为在此之后我会检查用户是否需要更多条件,比如让我找到所有没有 parent 且名称如 "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);
}