Solr: Использование подстановочного знака для термина, имеющего пробелы - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь найти термин, в котором есть пробелы и подстановочный знак в конце; т.е. name:John S* Solr не может вернуть какой-либо результат, хотя у меня есть перечисленные ниже записи и они возвращаются при запросе *:* из веб-интерфейса Solr;

  • Джон Доу
  • Джонни Инглиш
  • Джон Смит

Я использую Sol7.4 с DIH, который индексирует мою БД, и я создаю функцию поиска контактов (по имени и телефону) для моего веб-приложения.

Я подписался на эту тему Solr подстановочный запрос с пробелами однако это не решило проблему;

  1. Я попытался изменить тип моего поля (для поля name) на text_en, text_ws, и в настоящее время text_general, плюс, попытался экранировать пробел с обратной косой чертой "\", но это не сработало.
  2. Tried Solr " синтаксический анализатор сложных фраз ", который частично решил проблему, поскольку это значительно увеличит время запроса, кроме того, Solarium выдает исключение, если термин содержит пробелы в конце, т.е. "jhon \ *", и если я пытаюсь выполнить тот же запрос из веб-интерфейса Solr, я не получаю результата http://localhost:8983/solr/collection/select?q{!complexphrase inOrder=true}displayName:John\ *
  3. Также попробовал Префикс парсера запросов без удачи

Примечание: , что я перезагружал solr, очищал и переиндексировал свои данные после каждой попытки.

Ожидаемый результат:

  • при поиске "John" я должен получить все 3 записи:

    • Джон Доу
    • Джонни Инглиш
    • Джон Смит
  • при поиске «Джона», который будет анализироваться на «Джона»; Я должен получить:

    • Джон Доу
    • Джон Смит
  • и при поиске "John \ S *" я должен получить:

    • Джон Смит

Обновление # 1

search.php

...
    $term = str_replace(' ', '\ ', $request_params['term']);
    $query->setQuery('phone:"%1%" OR name:"%1%" OR contact:%2%*', [$request_params['term'], $term]);
    // $query->setQuery('phone:"%1%" OR name:"%1%" OR contact:"%2%*"', [$request_params['term'], $term]);
...

управляемая схема

...
  <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
      <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>
...
  <field name="name" type="text_general" multiValued="false" indexed="true" stored="true"/>
  <field name="contact" type="lowercase" indexed="true" stored="true"/>
  <field name="phone" type="string" docValues="false" multiValued="false" indexed="true" required="true" stored="true"/>
  <copyField source="displayName" dest="card"/>
  <!-- <copyField source="phone" dest="card"/> -->
...

1 Ответ

0 голосов
/ 21 января 2019

Используйте второе поле для совпадений с подстановочными знаками, к которому прикреплен KeywordTokenizer с прикрепленным LowercaseFilterFactory. Используйте инструкцию copyField для копирования содержимого из основного поля во второе поле с подстановочными знаками.

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

Ваш второй приведенный выше пример (John\ *) в действительности, вероятно, будет соответствовать только тому, что присутствует токену Джону (и вы пропускаете = между именем аргумента q и самим аргументом).

...