在hibernate搜索中组合查询

时间:2013-07-06 08:03:56

标签: hibernate lucene hibernate-search

Hibernate Search(lucene)是否有可能组合两个不同的查询。例如,当我想搜索2个应具有一个相应匹配值的字段时:

firstname - John
lastname - Doe

qBuilder.keyword().onField("firstname").matching("John").createQuery());
qBuilder.keyword().onField("lastname").matching("Doe").createQuery());

是从这一个查询中获得的一种方法吗?

2 个答案:

答案 0 :(得分:7)

注意: 这样可行,但对于更多Hibernate-esque方法,请参阅我的其他答案

createQuery()返回标准Lucene Query。因此,在Lucene中合并两个查询的典型方法是使用BooleanQuery

Query query1 = qBuilder.keyword().onField("firstname").matching("John").createQuery();
Query query2 = qBuilder.keyword().onField("lastname").matching("Doe").createQuery();
BooleanQuery bq = new BooleanQuery();
//Assuming you want to require a match on both first and last names.
//If a match on either is enough, use BooleanClause.Occur.SHOULD
bq.add(new BooleanClause(query1, BooleanClause.Occur.MUST));
bq.add(new BooleanClause(query2, BooleanClause.Occur.MUST));

答案 1 :(得分:6)

而不是直接使用Lucene BooleanQuery,更多的Hibernate方法是使用Hibernate bool()查询(参见documentation here的5.1.2.6节):

Query query = qBuilder.bool()
    .must(qBuilder.keyword().onField("firstname").matching("John").createQuery())
    .must(qBuilder.keyword().onField("lastname").matching("Doe").createQuery())
    .createQuery();