комбинировать запросы в спящем поиске

есть ли возможность в Hibernate Search (lucene) объединить два разных запроса. Например, когда я хочу выполнить поиск с двумя полями, которые должны иметь одно соответствующее совпадающее значение:

firstname - John
lastname - Doe

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

есть способ сделать из этого один запрос?


person adaniluk    schedule 06.07.2013    source источник


Ответы (2)


Примечание. Это работает, но для более похожего на Hibernate подхода см. мой другой ответ

createQuery() возвращает стандартный запрос Lucene. Таким образом, типичным способом объединения двух запросов в Lucene является Булев запрос:

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));
person femtoRgon    schedule 06.07.2013

Вместо того, чтобы использовать 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();
person femtoRgon    schedule 16.09.2014
comment
Большое спасибо. Как насчет того, чтобы значение firstname или lastname было нулевым (в случае, когда пользователь искал только John, не указывая Doe)? Можем ли мы использовать аналогичный запрос без предварительной проверки нулевых значений. Это для сценария, в котором у нас есть много необязательных параметров поиска. - person MichaelCleverly; 07.12.2015
comment
@MichaelCleverly — если пункты должны быть необязательными, просто добавьте к ним .should вместо .must. - person femtoRgon; 07.12.2015