1

次のクラスがあるとしましょう。(最も重要なものだけが含まれています)

public class Client {
    /* Some Properties */
}

public class ClientDocumentAssociation {
    @ManyToOne
    private Client client;

    /* Some Properties */
}

@Indexed
public class Document {
    @OneToOne
    private ClientDocumentAssociation clientAssociation;

    @Field(name = "text")
    private String text;

    /* Some Properties */
} 

私の基本的なドキュメント検索は次のようになります。

public List<AbstractDocument> searchDocuments(String text) {
    if (text == null) {
        return newArrayList();
    }

    FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManagerProvider.get());
    MultiFieldQueryParser parser = new MultiFieldQueryParser(DOCUMENT_FIELDS, new StandardAnalyzer());
    parser.setDefaultOperator(Operator.AND);
    FullTextQuery ftq;

    try {
        Query q = parser.parse(text + "*");

        ftq = ftem.createFullTextQuery(q, Document.class);

        ftq.setMaxResults(20);

        List<AbstractDocument> results = ftq.getResultList();
        return results;
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return newArrayList();
}

ここで、ドキュメントを検索できるようにしたいのですが、インデックス全体の範囲ではなく、特定のクライアントに属するドキュメントを検索するだけです。私の頭に浮かぶのは、インデックスに関連付けを追加し、検索の適切なフィールドにクライアントIDを追加することだけです。しかし、それは正しくないようです。別の選択肢が必要であり、それが私が求めているものです。

4

3 に答える 3

2

なぜあなたの最初の考えは間違っているように見えるのですか?実際、検索に必要なすべてのデータにインデックスを付けることは、これを行うための推奨される方法です。それが@IndexedEmbeddedの目的です。データにインデックスを付けると、クエリや新しいクエリの変更に対する柔軟性も高まります。

于 2010-02-20T01:22:39.593 に答える
1

これを行うもう1つの方法は、フィルターを使用することです。Lucene検索にフィルターを適用できます。Hibernateは、注釈としてフィルターを追加し、実行時にそれらを有効にすることをサポートします

于 2010-03-03T01:07:29.000 に答える
0

わかりました、私は実際に解決策を見つけました。私(および同じ問題の解決策を探していた人)が必要としたのは、FullTextQueryの基準を設定することです。

    Session session = (Session) ftem.getDelegate();
    Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
            Restrictions.eq("client", owner));

    /* .... */

    ftq.setCriteriaQuery(criteria);

うまくいくようです:)

于 2010-02-19T12:13:02.137 に答える