#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>