2

特定のフィールドを持たず、1 つのフィールドに適切な値を持つすべてのドキュメントを選択する必要があります。null のフィールドの値として「null」文字列を使用しないようにしているため、lucene では、これらのフィールドはそれらのドキュメント用に保存されません。

ドキュメント構造は次のようになります

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

私が望むのは、親を持たないすべての familyMembers を取得することです。そのように見ると、ツリーのルートとしましょう。

私は多くの方法を試しましたが、これが最善の方法のようです:

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

しかし、何らかの理由で、このクエリを試すたびに、1 つを除いて親を持たないすべての familyMambers を取得します! そして、最後に試したツリー構造が何であれ、親を持つメンバーは1つだけで終わります....

誰かが私が間違っていることを知っていますか、または1つのフィールドを持たないドキュメントを見つけるためのより良い方法を知っていますか?

この後、親を持たず、「Bill」のような名前を持つすべてのメンバーを取得するなど、ユーザーがさらに条件を必要とするかどうかを確認するため、booleanQuery を使用しています。

EDIT 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 に答える