Как объединить несколько токенов в один

В 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>
Другие вопросы по тегам