Лучший способ поиска динамического списка полей с помощью 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 (минимальное соответствие).

Другие вопросы по тегам