3

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

firstname - John
lastname - Doe

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

是一种从这个查询中进行的方法吗?

4

2 回答 2

7

与其直接使用 Lucene BooleanQuery,更多的 Hibernate 方法是使用 Hibernate查询(请参阅此处文档bool()的第 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();
于 2014-09-16T17:26:37.113 回答
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));
于 2013-07-06T08:30:50.693 回答