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 для получения дополнительной информации. Детали.
Изменить: Подробнее о различных способах индексирования данных см. Анализаторы, токенизаторы и фильтры токенов и как это влияет на поиск ваших данных.