Как объединить несколько токенов в один
В Solr при объединении токенов с использованием solr.ShingleFilterFactory он может генерировать несколько Shingles в зависимости от min/maxShingleSize и токенов для объединения. Из-за этого поиск не проходит. Как я могу объединить несколько токенов в один, чтобы мой поиск работал. Вот мои настройки:
<fieldType name="text_ngram" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\b \b" replacement=""/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"/>
<filter class="solr.ShingleFilterFactory" tokenSeparator="" minShingleSize="2" maxShingleSize="7" outputUnigrams="false"/>
<filter class="solr.LengthFilterFactory" min="6" max="7"/>
</analyzer>
</fieldType>
Вот отладочный вывод для запроса name_ngram:"наша G20 9NS"
"debug": {
"rawquerystring": "name_ngram:\"our G20 9NS\"",
"querystring": "name_ngram:\"our G20 9NS\"",
"parsedquery": "PhraseQuery(name_ngram:\"rg209ns g209ns\")",
"parsedquery_toString": "name_ngram:\"rg209ns g209ns\"",
"explain": {},
Спасибо заранее,
2 ответа
Я столкнулся с той же проблемой и решил ее так без какого-либо специального кода:
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
<filter class="solr.FingerprintFilterFactory" separator="_" />
<filter class="solr.PatternReplaceFilterFactory" pattern="(_)" replacement="" replace="all"/>
Ключевым моментом является отпечаток пальца с _, а затем замена _ на пустой
Надеюсь, поможет
Я смог решить эту проблему, переместив сопоставление синонимов за пределы конфигурации Solr. Я написал собственный код, который позаботится об этом. Вот окончательная схема:
<!-- Added for NGram field-->
<fieldType name="text_ngram" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\b \b" replacement=""/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="\b \b" replacement=""/>
</analyzer>
</fieldType>