Подтвердить что ты не робот

Поиск 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>
4b9b3361

Ответ 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 введите описание изображения здесь