Как включить нечеткий поиск в solr 7.7? - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь найти нечеткий текст для заголовка, но solr не дает результатов по названию с ошибкой " hilfinger ":

http://rex:8983/solr/project/select?fq=white_label_id%3A6&q=title%3Ahilfinger~
{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"title:hilfinger~",
      "fq":"white_label_id:6",
      "_":"1554887612686"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

Используя стандартный поиск, я получу результаты при правильном именовании hilfiger :

http://rex:8983/solr/project/select?fq=white_label_id%3A6&q=title%3Ahilfiger
{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"title:hilfiger",
      "fq":"white_label_id:6",
      "_":"1554887612686"}},
  "response":{"numFound":27,"start":0,"docs":[
      {

Что-то мне нужно активировать в конфигурации solr, чтобы включить нечеткий поиск, или с чем связано получение 0 результатов?

1 Ответ

1 голос
/ 11 апреля 2019

Да! вы можете. Вам просто нужно правильно настроить поля в schema.xml, для которых вы хотите включить нечеткий поиск или частичные совпадения. Вы можете добавить фильтры к нужному полю во время индексации, чтобы Solr указывал хранить ngrams каждого значения в дополнение к исходному значению. Позже на этом поле можно выполнить нечеткий поиск. По умолчанию существует два типа таких фильтров, и вам нужно только прикрепить их к цепочке фильтров анализатора индекса.

  • EdgeNGramFilterFactory - сопоставлять только префиксы и суффиксы (сопоставлять только края поисковой фразы)
  • NGramFilterFactory - соответствует нграмм в любом месте фразы

В обоих случаях вам придется определить минимальный и максимальный размер нграмм, которые будут генерироваться во время индексации. (Обратите внимание, что это также увеличит размер вашего индекса.) Давайте определим ваше поле заголовка в файле schema.xml с помощью фильтра.

<fieldType name="title" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
   </analyzer>
   <analyzer type="query">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
   </analyzer>
</fieldType>

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

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>

с

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...