У меня возникла проблема с результатом solr, и я подумал, что попрошу предложения здесь.Solr phonetic matching vs real text field
Я включил фонетическое соответствие, включив <filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>
как на уровне запросов, так и на уровне индекса, а также с кодировщиком DoubleMetaphone
в качестве варианта.
Проблема заключается в том, что solr возвращает только фонетически согласованный результат и не учитывает подстановочные знаки или почти точное соответствие фразы.
Пример:
В моем индексе, у меня есть документ с поля под названием «имя» и значение «Modenine», когда я искать name:mod
, я получаю «Modenine
», который в порядке,
Но когда я ищу, используя name:mode
, обратите внимание на дополнительный 'e'
, он возвращает 'Something Foul Mouth'
, и это потому, что mouth
phonetically соответствует mode
, я не против иметь «Something Foul Mouth», но я также хочу видеть «Modenine» с mode
- это реальный поисковый запрос.
Быстрое решение, которое приходит мне в голову, позволяет добавить фонетический код для индексации во время индексации, а затем использовать утилизацию для ранжирования результата путем предоставления оценки, например, с помощью^2.0.
У меня есть следующее: объявления полого
<field name="phoneticName" type="phonetics" indexed="true" stored="true"/>
<field name="name" type="phonetics" indexed="true" stored="true"/>
FieldType для фонетики
<fieldType name="phonetics" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<filter class="solr.LowerCaseFilterFactory"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PhoneticFilterFactory" encoder="RefinedSoundex" inject="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
Но после повторной индексации, поле phoneticName только имеет точное значение поля имени, это Безразлично Храните фонетический код, который я пытаюсь найти.
Я нашел это solr-boosting-down-phonetic-variations, но не так много деталей.
Благодаря P
Другим способом достижения этого без использования NgramFilter, поскольку анализ влияет на время индексирования, заключается в том, чтобы на самом деле одновременно выполнять подстановочные и фонетические соответствия. например (имя: mod *^10.0 ИЛИ имя: mode^2.0) И другие поля, если требуется. Вы также можете добавить имя OR: mod ~^1.0 для ближайшего фонетического соответствия. Это также хорошо помогло мне. Помните, что имя должно быть типа phonetics в объявлении поля для имени. «^» - для подсчета очков. Приветствия Бабаджиде P –