在hibernate搜索中组合查询

在hibernate搜索中组合查询,hibernate,lucene,hibernate-search,Hibernate,Lucene,Hibernate Search,在HibernateSearch(lucene)中是否有可能组合两个不同的查询。例如,当我想使用两个字段进行搜索时,这两个字段应该有一个对应的匹配值: firstname - John lastname - Doe qBuilder.keyword().onField("firstname").matching("John").createQuery()); qBuilder.keyword().onField("lastname").matching("Doe").createQuery()

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

firstname - John
lastname - Doe

qBuilder.keyword().onField("firstname").matching("John").createQuery());
qBuilder.keyword().onField("lastname").matching("Doe").createQuery());
这是一种从这一个查询中进行查询的方法吗?

注意:这是可行的,但有关更像Hibernate的方法,请参阅我的另一个答案

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

queryquery1=qBuilder.keyword().onField(“firstname”).matching(“John”).createQuery();
Query query2=qBuilder.keyword().onField(“lastname”).matching(“Doe”).createQuery();
BooleanQuery bq=新的BooleanQuery();
//假设您希望名字和姓氏都匹配。
//如果其中一个上的匹配已足够,请使用BooleanClause.occurrent.SHOULD
添加(新的BooleanClause(query1,BooleanClause.occure.MUST));
add(新的BooleanClause(query2,BooleanClause.occure.MUST));

与其直接使用Lucene
BooleanQuery
,不如使用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();

非常感谢。如果值“firstname”或“lastname”为空(在用户只搜索“John”而不提供“Doe”的情况下)如何?我们是否能够使用类似的查询,而不必首先检查空值。这适用于我们有很多可选搜索参数的场景。@MichaelCleverly-如果子句应该是可选的,只需将它们与
一起添加。应该
,而不是
。必须