AnalyzingInfixSuggester, дающий одно предложение

#solr #lucene #autosuggest

#solr #lucene #автоматическое предложение

Вопрос:

Для одного и того же словаря, который выдает несколько предложений для AnalyzingSuggester, он выдает только одно единственное предложение для AnalyzingInfixSuggester.

Ниже приведены мои конфигурации:

 <!-- AnalyzingInfixLookup suggest component (default)-->
<searchComponent class="solr.SpellCheckComponent" name="infix_suggest_analyzing">
<lst name="spellchecker">
  <str name="name">infix_suggest_analyzing</str>
  <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
  <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.AnalyzingInfixLookupFactory</str>
  <str name="storeDir">infix_suggest_analyzing</str>
  <str name="buildOnCommit">false</str>

  <!-- Suggester properties -->
  <str name="suggestAnalyzerFieldType">text</str>
  <str name="field">debug_field</str>
  <str name="sourceLocation">${solr.solr.home}/${solr.core.name}/dictionaries/dictionary.txt</str>
</lst>

  <!-- specify a fieldtype using keywordtokenizer   lowercase   cleanup -->
  <str name="queryAnalyzerFieldType">debug_type</str>
</searchComponent>

<!--  Infix analyzing handler (default) -->
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/infix_suggest_analyzing">
<lst name="defaults">
  <str name="spellcheck">true</str>
  <str name="spellcheck.dictionary">infix_suggest_analyzing</str>
  <!-- NOTE: if this is false, results are alpha-ordered, not by weight! -->
  <str name="spellcheck.onlyMorePopular">true</str>
</lst>
<arr name="components">
  <str>infix_suggest_analyzing</str>
</arr>
</requestHandler>
  

Моя схема:

 <fieldtype name="debug_type" class="solr.TextField" positionIncrementGap="1000">
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
 </fieldtype>


<!-- basic text field -->
<fieldtype name="text" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldtype>

<fieldtype name="phrase_suggest" class="solr.TextField">
<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.PatternReplaceFilterFactory"
          pattern="([^p{L}p{M}p{N}p{Cs}]*[p{L}p{M}p{N}p{Cs}_] :)|([^p{L}p{M}p{N}p{Cs}]) "
          replacement=" " replace="all"/>
  <filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.TrimFilterFactory"/>
</analyzer>
  

Есть идеи, почему он предлагает только одно предложение? Я использую solr 4.6, и словарь имеет формат . Это отлично работает с AnalyzingSuggester.

Комментарии:

1. Если учесть, что по умолчанию минимальная длина префикса в этом suggesterе равна 4, имеет ли это смысл? Кроме того, если это отлично работает с AnalyzingSuggester , почему вы это не используете? Независимо от того, верны ваши результаты или нет, они не делают одно и то же.

2. Я видел код, DEFAULT_MIN_PREFIX_CHARS — это минимальные символы, после которых используется PrefixQuery. Предоставление запроса длиной более 4 не влияет на результат. Я не использую AnalyzingSuggester, поскольку хочу использовать инфиксную функцию AnalyzingInfixSuggester. Вот почему.

Ответ №1:

Я не уверен, отвечает ли это на ваш вопрос, но вот мой рабочий пример.

Я использую Solr 4.6.0 . Мой словарь основан на string поле: suggest_field . Тип файла suggest_string используется только предлагающим, обратите внимание, что он использует

 <tokenizer class="solr.StandardTokenizerFactory" />
  

функция инфикса не работает с solr.KeywordTokenizerFactory .

schema.xml:

 <field name="suggest_field" type="string" indexed="true" stored="true" multiValued="true"/>

<fieldType name="suggest_string" class="solr.TextField" sortMissingLast="true" omitNorms="true">
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>           
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory"/>
    </analyzer>
</fieldType>
  

solrconfig.xml:

 <searchComponent class="solr.SpellCheckComponent" name="suggest">
    <lst name="spellchecker">
        <str name="name">suggest</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.AnalyzingInfixLookupFactory</str>
        <str name="field">suggest_field</str>

        <!-- Minimum frequency of terms to consider when building the dictionary
        0 == all terms -->
        <float name="threshold">0.0</float> 
        <str name="buildOnCommit">true</str>
        <str name="suggestAnalyzerFieldType">suggest_string</str>

        <bool name="exactMatchFirst">true</bool>
    </lst>
</searchComponent>

<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest</str>
        <str name="spellcheck.onlyMorePopular">true</str>
        <str name="spellcheck.count">10</str>
        <str name="spellcheck.collate">false</str>
    </lst>
    <arr name="components">
        <str>suggest</str>
    </arr>
</requestHandler>