Лучший способ поиска динамического списка полей с помощью Solr?
Мы реализуем функцию поиска, используя Solr в качестве внутреннего движка. Данные извлекаются из базы данных с использованием DIH. Основная информация документа, в том числе:
- product number (number)
- product name (name)
- applicant name (applicant)
- product purpose (purpose)
Все поля хранятся и индексируются.
Мы предоставляем одно окно поиска для пользователей, чтобы ввести любое количество ключевых слов, и система будет искать по всем полям и пытаться сопоставить их все. Для этого мы создаем дополнительное поле, объединяющее всю вышеприведенную информацию, используя "copyField".
Однако еще одно требование заключается в том, что пользователь сможет ограничить свой поиск в выбранных целевых полях. Например, пользователь может выбрать только поля имени и назначения. В этом случае поиск по ключевым словам будет искать только из этих двух полей.
В настоящее время мы используем следующий подход к запросу для достижения этой функции:
Например, учитывая, что
- the user provide keywords: K1 and K2,
- and the user want to search on name, applicant and purpose only,
следующая строка поиска будет сгенерирована динамически и отправлена в Solr:
(name:K1 OR applicant:K1 OR purpose:K1) AND (name:K2 OR applicant:K2 OR purpose:K2)
Есть ли другой способ реализовать функцию? Был бы очень признателен, если бы вы могли поделиться своим опытом.
Спасибо фан
1 ответ
Вы можете проверить обработчик запросов с помощью edismax и с конфигурацией по умолчанию qf
который будет искать на поле копирования, который содержит данные из всех полей.
qf поле запроса, в котором будет выполняться запрос.
Вам просто нужно передать один параметр, чтобы решить qt=edismax&q=K1 K2
для поиска.
<requestHandler name="edismax" class="solr.SearchHandler" >
<lst name="defaults">
<str name="defType">edismax</str>
<str name="qf">
all_fields
</str>
<str name="fl">
*,score
</str>
<str name="q.alt">*:*</str>
</lst>
</requestHandler>
Если пользователь хочет выполнить поиск по имени или цели, я бы предложил просто передать поля и запрос этому обработчику запросов.
Переданные параметры переопределяют параметры по умолчанию.
Вам просто нужно передать один параметр, чтобы решить qt=edismax&q=K1 K2&qf=name applicant
для поиска.
Вы можете контролировать поведение OR, используя параметр mm (минимальное соответствие).