Solr Fuzzy Поиск похожих слов

Я пытаюсь выполнить нечеткий поиск "jahngir" ~ 0.2, который не возвращает никаких результатов. У моих индексов есть записи с данными "JAHANGIR RAHMAN MD". Если я попытаюсь выполнить поиск с точным словом "jahangir" ~ 0.2, он будет работать. Может кто-то, пожалуйста, помогите, на чем я поступаю неправильно. Я потратил много времени, пытаясь выяснить, как работает поиск Solr Fuzzy. Любые ссылки, которые объясняют поиск Solr Fuzzy, были бы полезны. Ниже приведено текстовое поле, которое я использую для индексирования. Спасибо заранее.

 <fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <!-- Case insensitive stop word removal.
      add enablePositionIncrements=true in both the index and query
      analyzers to leave a 'gap' for more accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            enablePositionIncrements="true"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="false"/>
  </analyzer>
</fieldType>

Вот конфигурация, которая работала для меня после ответа. Спасибо!

<!-- Modified to fit fuzzy queries -->  
    <fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false">
      <analyzer type="index">
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StandardFilterFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

Ответы

Ответ 1

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

В текстовом поле слишком много фильтров. Вы преобразовываете слово в основу Портера, которая часто не является реальным словом, а затем берет фонетический ключ. Поверхностное слово редко будет соответствовать фонетическому ключу, хранящемуся в индексе. Фонетический ключ будет сильно отличаться от исходного слова.

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

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

  • text_exact: строчный, об этом
  • text_stem: строчные буквы и стебель
  • text_phonetic: строчный и двойной метафоны, не создавайте

Использовать нечеткое соответствие с text_exact, поскольку оно обрабатывает ошибки ввода. Не используйте fuzzy для других полей.

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

Ответ 2

Чтобы Fuzzy Searches работал, вам нужно будет включить правильный Stemming и/или фильтр Factory для нужного вам языка. См. Langauge Analysis в разделе Solr Wiki для получения дополнительной информации. Детали.

Изменить: Подробнее о различных способах индексирования данных см. Анализаторы, токенизаторы и фильтры токенов и как это влияет на поиск ваших данных.