假设我有以下课程。 (只包括最重要的事情)
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添加到搜索中的相应字段。但这似乎不对。必须有另一种选择,这就是我要求的。
答案 0 :(得分:2)
为什么你最初的想法似乎错了?实际上,为搜索所需的所有数据编制索引是推荐的方法。这就是@IndexedEmbedded的用途。索引数据还可以为查询和/或新查询的更改提供更大的灵活性。
答案 1 :(得分:1)
另一种方法是使用过滤器。过滤器可以应用于Lucene搜索。 Hibernate支持添加过滤器作为注释并在运行时启用它们
答案 2 :(得分:0)
好的,我确实找到了解决方案。我(以及正在寻找同一问题的解决方案的任何人)需要的是为FullTextQuery设置Criteria。
Session session = (Session) ftem.getDelegate();
Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
Restrictions.eq("client", owner));
/* .... */
ftq.setCriteriaQuery(criteria);
似乎工作正常:)