Как получить счетчик результатов поиска в спящем режиме для каждого объекта в списке результатов запроса
Вот мой код
luceneQuery = qb.bool()
.should(qb.keyword().onField("firstName").matching("abraham").createQuery())
.should(qb.keyword().onField("lastName").matching("lincoln").createQuery())
.should(qb.keyword().onField("phone").matching("9895873039").createQuery())
.should(qb.keyword().onField("email").matching("abraham@gmail.com").createQuery()).createQuery();
FullTextQuery query = fullTextEntityManager.createFullTextQuery(luceneQuery, Notes.class);
query.setProjection(
FullTextQuery.SCORE,
FullTextQuery.EXPLANATION,
FullTextQuery.THIS);
List<Object[]> results = query.getResultList();
for(Object[] a : results)
{
ObjectMapper om=new ObjectMapper();
Object[] firstResult = (Object[]) a;
String score = firstResult[0].toString();
String explanation = firstResult[1].toString();
Patients o = (Patients) firstResult[2];
log.debug("score query : " + score);
log.debug("explanation query : " + explanation);
log.debug("o query : " + om.writeValueAsString(o));
}
мне нужно 4 балла за объекты, соответствующие всем полям
3 балла за объекты, соответствующие любым 3 полям
оценка как 2 для объектов, которые соответствуют любым 2 полям
оценка как 1 для объектов, которые соответствуют любому 1 полю
Это возможно??
1 ответ
Я бы порекомендовал переосмыслить ваши требования и посмотреть, действительно ли вам нужен этот "балл". Если вам нужно упорядочить документы от "наиболее подходящих" к "наименее подходящим", то Hibernate Search (фактически Lucene) уже делает это по умолчанию.
Теперь, если вам действительно нужна эта "оценка"... Самый простой способ - это выполнить несколько запросов:
- первым будет ваш запрос, как есть
- второй будет запросом только по полю "firstName" и дополнительным фильтром по идентификаторам, чтобы рассматривать только объекты, соответствующие первому запросу.
- третьим будет запрос только по полю "lastName" и дополнительный фильтр по идентификаторам, который будет рассматривать только объекты, соответствующие первому запросу.
- четвертый - это запрос только по полю "телефон" и дополнительный фильтр по идентификаторам, который учитывает только объекты, соответствующие первому запросу.
- пятым будет запрос только по полю "email" и дополнительный фильтр по идентификаторам, который будет рассматривать только объекты, соответствующие первому запросу.
Затем вы можете вычислить для каждого результата первого запроса, сколько других запросов ему соответствует. Это даст вам ваш "счет".
Очевидно, что производительность не будет большой, так как вы будете выполнять пять запросов вместо одного. Но, по крайней мере, он должен делать то, что вы хотите.
Если вам нужна более высокая производительность и вы не боитесь трудностей... Может быть, есть способ вычислить количество совпавших полей и использовать их в качестве оценки, создав собственную реализацию Lucene Query вместо использования BooleanQuery по умолчанию (это то, что Hibernate Search построитель запросов делает). Но я бы не советовал, если вы не обладаете глубокими знаниями Lucene: работать с внутренностями Lucene действительно нелегко. Кроме того, при этом вы потеряете возможность сортировать свои результаты по стандартному баллу Lucene, что гораздо более тонко.
Если вы хотите пойти по этому пути, взгляните на исходный код org.apache.lucene.search.BooleanQuery
, org.apache.lucene.search.BooleanWeight
а также org.apache.lucene.search.BooleanScorer
, В зависимости от условий лицензирования ваших проектов, вы можете скопировать / вставить этот код, переименовать классы и изменить код в соответствии с вашими потребностями. Еще раз, я не рекомендую это.
Соответствующий ответ: /questions/14862428/hibernate-search-kak-poluchit-sovpadayuschie-imena-polej/14862439#14862439