Как я могу сообщить Solr о возврате условий поиска для каждого документа?

У меня вопрос о запросах в Solr. Когда я выполняю запрос с несколькими поисковыми терминами, которые все логически связаны с OR (например, q=content:(foo OR bar OR foobar)), чем Solr возвращает список документов, все из которых соответствуют любому из этих условий. Но что Solr не возвращает, какие документы были удалены по тому термину (терминам). Итак, в приведенном выше примере, я хочу знать, какие документы в моем списке результатов содержат термин foo и т.д. Учитывая эту информацию, я мог бы создать матрицу терминов и документов.

Итак, мой вопрос: как я могу рассказать Солру, чтобы он дал мне эту недостающую информацию? Я уверен, что это где-то, иначе поиск в целом не сработает. Но чего мне не хватает? Благодарим за помощь.

PS: В качестве обходного пути я выполняю один запрос Solr для всех условий поиска. Но, как вы можете себе представить, это дезертир в вопросах производительности, поскольку количество поисковых терминов может превышать 50: (

Ответ 1

Вид зависит от ваших требований, но насколько я знаю, в Solr нет конкретной поддержки для этого. Однако вы можете взломать его несколькими способами. Не уверен, что вы можете ожидать от производительности для них, т...

Использовать подсветку

Если вы используете подсветку, вы можете проанализировать возвращенные выделенные фрагменты для начальных и конечных тегов выделенного текста. Это будет термин, который соответствует чему-то в вашем запросе.

Использовать информацию debugQuery

Вы можете проанализировать информацию, возвращаемую запросом, с помощью debugQuery=true, чтобы определить, что термин был связан с результатом, посмотрев на termWeight (iirc). Это может быть отфильтрованная версия вашего первоначального термина (если у вас есть и т.д., действующие для поля).

Использовать слияние полей

Используя group.query, вы можете создавать списки документов, которые соответствуют каждому термину, вместо того, чтобы выдавать несколько запросов. Вы также можете создавать запросы, которые содержат несколько терминов OR-ed вместе, если вам нужны списки для "содержит". Может быть неэффективно для большого количества полей.

Проведите анализ возвращенного документа самостоятельно

Получить документ, а затем извлечь условия самостоятельно. Требуется немного нечеткого совпадения, так как вам также придется иметь дело с обработкой текста на стороне Solr.

Использовать функциональные запросы

Вы можете получить метавы для каждого документа с каждым термином из FunctionQuery, который просматривает число вхождений термина в этом документе. Будет потребоваться довольно много функциональных запросов для большого количества терминов, но может быть быстрым.

.. ни один из вариантов не идеален, но может работать для проблемы.

Ответ 2

Мой комментарий как ответ:

Я использую функциональные запросы, и кажется, что производительность не является проблемой:) Для тех, кто заинтересован: я использую функцию exists и добавляю псевдо-поле для каждого поискового термина следующим образом: fl=exists(query({!v='content:(foo)'})),exists(query({!v='content:(bar)'})). Из ответа я анализирую поисковый запрос с помощью регулярного выражения.

Как сказал Павел выше, вы можете псевдонизировать псевдо-поля, чтобы избежать разбора регулярных выражений, например. fl=foo:exists(query({!v='content:(foo)'}))