EdgeNGramFilterFactory не работает нормально в Solr

Я пытаюсь solr.EdgeNGramFilterFactory в Solr, который объясняется здесь, я добавил <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" /> в индексном анализаторе в fieldType schema.xml. Как я знаю, solr.EdgeNGramFilterFactory создает токены, такие как

whether - wh, whe, whet, wheth, whethe, whether.

Итак, когда я ищу запрос - дает ли он все документы, которые содержат токены слова "ли"

"suggestion":["wether","ether","heather","walther" "weather","wheeler", "fletcher", "shepherd","together","whenever","wherever","another","blather","bother","brother","chothe","eiher","either","farther","father""feather","further","gather","goethe","günther" "higher","hucher","leather","mother","neither","nyheter", "other","rather","whence",      "where""shepherds","weathered","altogether","breathed","brothers","feathers","hitherto","northern","preacher","southern","withered"]

Мне нужно только соответствующие документы, такие как для слова, мне нужно weather, wether, ether, heather не ненужный документ вроде brother, shepherd etc,

schema.xml:

<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" />
        <filter class="solr.LowerCaseFilterFactory"/>        
    </analyzer>
</fieldType>

solrconfig.xml:

<searchComponent name="suggest" class="solr.SpellCheckComponent">
<lst name="spellchecker">
      <str name="name">default</str>
      <str name="field">term</str>
     <str name="dictionaryImpl">DocumentDictionaryFactory</str>
      <str name="lookupImpl">org.apache.solr.spelling.suggest.jaspell.JaspellLookupFactory</str>
      <str name="buildOnCommit">true</str>
      <str name="queryAnalyzerFieldType">textSpell</str>
      </lst> 
    </searchComponent>

   <requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="df">term</str>
      <str name="spellcheck">on</str>
      <str name="spellcheck.dictionary">default</str>
      <str name="spellcheck.onlyMorePopular">true</str>
      <str name="spellcheck.count">500</str>
    </lst>
    <arr name="components">
      <str>suggest</str>
    </arr>
  </requestHandler>

3 ответа

Решение
  • Первое:

solr.EdgeNGramFilterFactory не работает популярно на предложениях, которые мы получаем в блоке предложений. Предложения приходят по умолчанию, используя class="solr.SpellCheckComponent" solr.EdgeNGramFilterFactory работает с ответом / результатом, который приходит от запроса, который мы задаем.

  • Второе:

    MaxResultForSuggest = значение. где значение может быть 10 (целое число)

Если результаты / ответ на запрос превышают заданное значение MaxResultForSuggest, он дает CorrectlySpelled = trueине дает предложений по запросу, в то время как если результаты / ответ на запрос приходят меньше, чем установленное значение MaxResultForSuggest, то он дает CorrectlySpelled = falseидает предложения по запросу.

         <str name="spellcheck.maxResultsForSuggest">10</str>
  • В третьих:

Вы можете установитьограничение для отображения предложения, используя spellcheck.alternativeTermCount.

        <str name="spellcheck.alternativeTermCount">20</str>
  • Четвертый

OnlyMorePopular = true: - Работаетлучше в / предложить, потому что он всегда дает подсказки для слова, может ли оно быть написано правильно или неправильно.

OnlyMorePopular = true: -хуже работает в /spell, потому что не дает подсказок по правильному слову. В моем случае, это работает, как это, и мне нужно предложение относительно правильно написанного слова также. Итак, я удалил свойство OnlyMorePopular изначение по умолчанию OnlyMorePopular равно false.

  <str name="spellcheck.onlyMorePopular">false</str>

Создайте хорошее предложение как по правильно написанному слову, так и по неверному слову.

Schema.xml:

<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

Solrconfig.xml:

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">textSpell</str>
    <lst name="spellchecker">
      <str name="name">default</str>
      <str name="field">term</str>
      <str name="classname">solr.DirectSolrSpellChecker</str>
      <str name="distanceMeasure">internal</str>      
      <float name="accuracy">0.5</float>
      <int name="maxEdits">2</int>
      <int name="minPrefix">0</int>
      <int name="maxInspections">5</int>
      <int name="minQueryLength">2</int>
      <float name="maxQueryFrequency">0.01</float>
    </lst>
</searchComponent>

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
      <str name="df">term</str>
      <str name="spellcheck.dictionary">default</str>
      <str name="spellcheck">on</str>
      <str name="spellcheck.extendedResults">true</str>       
      <str name="spellcheck.count">10</str>
      <str name="spellcheck.maxResultsForSuggest">10</str>
      <str name="spellcheck.alternativeTermCount">30</str>
    </lst>
    <arr name="last-components">
      <str>spellcheck</str>
    </arr>
  </requestHandler>

Попробуйте установить minGramSize на большее значение, например. 4 или 5, чтобы уменьшить количество несоответствующих совпадений. Кроме того, ознакомьтесь с документацией для получения более подробной информации https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

Как я вижу в вашем файле schema.xml, вы используете NGramFilterFactory вместо Edge NGramFilterFactory. Это означает, что вы не создаете токены, как вы описали:

Будь - что, где, или нет, или нет.

С помощью NGramFilterFactory вы используете токены, которые будут выглядеть так:

будь то, что, где, вот, вот, вот, вот, он, вот, он, он, он, он, он, он, это, человек, человек, человек, человек, человек,...

В зависимости от вашего варианта использования, вы также должны рассмотреть возможность использования различных токенизаторов и фильтров при индексации и запросах. Хороший способ проанализировать, что Solr делает с данными при индексировании и запросах, - использовать инструмент анализа https://cwiki.apache.org/confluence/display/solr/Analysis+Screen

Другие вопросы по тегам