Поиск Solr без определенных символов
У меня есть коллекция Solr, которая не возвращает результаты для нескольких символов, отличных от ASCII. Примером, который мы используем, является строка S11. • "≡ «Ñaïvétý» ‘¢¥£’ ¶!#%
; поиск этой цельной строки не возвращает никаких результатов, хотя у меня есть объект с индексом. Однако поиск подстрок этой строки возвращает совпадения. Единственными символами, которые заставляют Solr не возвращать совпадений, являются три в середине: • "≡
. Поле было проиндексировано как text_en
, но я также попробовал edge_ngram
(надеясь немного на магию Cargo Cult, чтобы исправить эту проблему). Есть ли что-то особенное в этих трех символах или мне нужно настроить, как Solr индексирует поля?
Мы выполняем поиск через django-haystack, но проблема возникает и в администраторе Solr.
Вот два определения типа поля:
<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.EdgeNGramFilterFactory"
minGramSize="2" maxGramSize="50" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
</analyzer>
</fieldType>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
enablePositionIncrements="true"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
enablePositionIncrements="true"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
Ответы
Ответ 1
Вы пробовали использовать ASCIIFoldingFilterFactory
Преобразует алфавитные, числовые и символические символы Юникода, которые не находятся в первых 127 ASCII-символах ( "Basic Latin" Unicode блок) в их эквиваленты ASCII, если они существуют.
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>
Ответ 2
Можете ли вы попробовать это...
<fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="front"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="back"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
![введите описание изображения здесь]()
Ответ 3
Я попробовал оба полевых типа, которые вы разместили, и проверил их на странице анализа, которая поставляется с страницей администрирования Solr. Оба выглядят нормально - посмотрите ниже. Светлые оттенки серого указывают на то, что производится матч.
Это оставляет меня немного озадаченным. Есть несколько причин, почему вы не получаете удар:
- вы изменили schema.xml без перестройки индекса, это будет работать, но генерировать не удары
- вы используете обработчик запросов smax/edismax с параметром MM, определенным с неблагоприятным значением.
- Вы можете посмотреть это в своем файле solrconfig.xml
- Однако это только значение по умолчанию, параметр может быть изменен при отправке запроса из вашего кода.
- у вас есть интересные значения в трех файлах, которые участвуют во время индексирования, а именно:
- Ланг /stopwords _en.txt
- protwords.txt
- synonyms.txt
Результаты для text_en
![введите описание изображения здесь]()
Результаты для edge_ngram
![введите описание изображения здесь]()