Java Hibernate搜索-在给定范围内搜索
假设我有以下几节课。(仅包括最重要的内容) 我的基本文档搜索如下所示:Java Hibernate搜索-在给定范围内搜索,java,hibernate,lucene,hibernate-search,Java,Hibernate,Lucene,Hibernate Search,假设我有以下几节课。(仅包括最重要的内容) 我的基本文档搜索如下所示: public List<AbstractDocument> searchDocuments(String text) { if (text == null) { return newArrayList(); } FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManagerProvide
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();
}
公共列表搜索文档(字符串文本){
if(text==null){
返回newArrayList();
}
FullTextEntityManager ftem=Search.getFullTextEntityManager(EntityManager提供程序.get());
MultiFieldQueryParser parser=新的MultiFieldQueryParser(DOCUMENT_字段,new StandardAnalyzer());
解析器.setDefaultOperator(运算符.AND);
fulltextqueryftq;
试一试{
Query q=parser.parse(text+“*”);
ftq=ftem.createFullTextQuery(q,Document.class);
ftq.setMaxResults(20);
List results=ftq.getResultList();
返回结果;
}捕获(解析异常){
e、 printStackTrace();
}
返回newArrayList();
}
现在,我希望能够搜索文档,但不在整个索引的范围内,而只是查找属于给定客户机的文档。我唯一想到的是将关联添加到索引中,并将客户机id添加到搜索中的相应字段中。但这似乎并不正确。必须有另一个选择,这就是我所要求的 好的,我真的找到了解决办法。我(以及任何正在寻找相同问题解决方案的人)需要的是为FullTextQuery设置条件
Session session = (Session) ftem.getDelegate();
Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
Restrictions.eq("client", owner));
/* .... */
ftq.setCriteriaQuery(criteria);
看起来不错:)为什么你最初的想法似乎是错误的?事实上,为搜索所需的所有数据编制索引是推荐的方法。这就是@IndexedEmbedded的作用。为数据编制索引还可以为查询和/或新查询中的更改提供更大的灵活性。另一种方法是使用过滤器。过滤器可以应用于Lucene搜索。Hibernate支持将过滤器添加为注释,并在运行时启用它们我认为对某些值使用索引是不合适的(例如对某些布尔数据进行过滤似乎不正确)+给定的示例简化了,实际关联要复杂得多-因此我想用其他方式过滤结果。嗯。。。我做了一些研究,我认为你是对的,标准不是最好的方法。我将继续索引其他值。谢谢。这是不推荐的。例如,getResultSize()将返回不正确的值,分页将被拧紧。我推荐哈迪或康戈五世的解决方案
Session session = (Session) ftem.getDelegate();
Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
Restrictions.eq("client", owner));
/* .... */
ftq.setCriteriaQuery(criteria);