Нечеткий поиск части всего текста в Solr - PullRequest
1 голос
/ 30 марта 2020

У меня есть следующее объявление поля для моего индекса Solr:

<field name="description" type="text_ci" indexed="true" multiValued="false" required="true"/>

Тип поля:

<fieldType name="text_ci" class="solr.TextField" omitNorms="true" sortMissingLast="true">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType> 

В этом индексе у меня есть документы, где значение описания похоже на «Размещение в {city} "(у них всех разные города)

Я хочу сделать нечеткий поиск, и когда я, например, набираю с ошибкой *acomodation*~2, например, чтобы получить результаты, но мне сложно, потому что" размещение "просто часть текста.

Я думаю об использовании NGramFilter для токенизации ввода, но я не уверен, что это правильный путь и как его реализовать.

Знаете ли вы, что я могу сделать?

1 Ответ

2 голосов
/ 30 марта 2020

Lucene поддерживает нечеткие поиски на основе расстояния Левенштейна или алгоритма редактирования расстояния. Для нечеткого поиска используйте символ тильды, "~", в конце термина «Отдельное слово».

Я не вижу здесь необходимости в NGramFilter.

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

{FIELD_NAME:TERM_1~{Edit_Distance}

Ваш запрос будет выглядеть ниже.

http://localhost:8983/solr/FuzzySearchExample/select?indent=on&q=desc:Samsu~&wt=json&fl=id,desc

У меня был тип поля, как показано ниже.

<fieldType name="text_ci" class="solr.TextField" omitNorms="true" sortMissingLast="true">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

Я получаю ответ ниже для acomodation~2 или acomodation~1

Screenshot od solr query page

И я получаю ответ ниже для acomodation.

Screenshot of query page2

...