Hibernate Search - 指定されたスコープでの検索
-
21-09-2019 - |
質問
次のクラスがあるとします。(最も重要なものだけが含まれています)
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 を追加することです。しかし、それは正しくないようです。別の選択肢があるはずで、それが私が求めていることです。
解決
なぜ、あなたの最初のアイデアは間違っているように見えるのでしょうか?実際には、検索のために必要なすべてのデータのインデックスを作成、これを行うための推奨される方法です。それは@IndexedEmbedded何のためにそこにあるのです。データのインデックスを作成することも、あなたのクエリの変更および/または新しいクエリのためのより多くの柔軟性を提供します。
他のヒント
あなたがこれを行うことができ、他の方法は、フィルターを使用することです。フィルタは、Lucene検索に適用することができます。担体は注釈として、フィルタを追加すると、実行時にそれらを有効に休止状態
[OK]を私は実際に解決策を見つけました。 I(と同じ問題の解決策を探していた誰もが)必要な事はFullTextQueryための基準を設定しています。
Session session = (Session) ftem.getDelegate();
Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
Restrictions.eq("client", owner));
/* .... */
ftq.setCriteriaQuery(criteria);
[OK]を動作するようです:)
所属していません StackOverflow