Фильтр графа синонимов Solr не работает после другого фильтра

Я пытаюсь преобразовать 15.6" поисковых запросов в 15.6 inch. Идея заключалась в том, чтобы сначала заменить 15.6" на 15.6 ", а затем сопоставить " с правилом синонимов " => inch. Я создал определение типа:

<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern='^([0-9]+([,.][0-9]+)?)(")$' replacement="$1 $3" />
        <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" />
    </analyzer>
</fieldType>

но это не работает! Если я ввожу 15.6", я получаю 15.6 ", но когда я ввожу 15.6 ", я получаю то, что хочу - 15.6 inch.

Почему это не работает? Я что-то пропустил?

РЕДАКТИРОВАТЬ:

Анализ Solr: Не работает

Работает


person Maputo    schedule 29.01.2020    source источник
comment
Не могли бы вы просто заменить его на $1 inch в этом случае, вместо того, чтобы использовать синонимы? Используйте страницу Analysis в Solr's Admin, чтобы точно увидеть, как токены обрабатываются для каждого шага — она должна быть в состоянии сказать вам, как все выглядит после выполнения фильтра patternreplacefilter. Похоже, что вместо подгрупп есть подгруппы, поэтому $3, вероятно, неверно, если вы не переместите окончание )).   -  person MatsLindh    schedule 29.01.2020
comment
Я думаю, что мог бы, но позже я мог бы использовать PatternReplaceFilter для символов, отличных от ". С другой стороны, описанный выше подход кажется совершенно логичным, за исключением того, что он не работает, поэтому я хотел знать, есть ли за этим какие-то рассуждения...   -  person Maputo    schedule 29.01.2020
comment
Вот почему вы собираетесь использовать страницу анализа администратора Solr, чтобы точно увидеть, что происходит для каждого шага в вашей цепочке — надеюсь, тогда проблема должна быть очевидной.,   -  person MatsLindh    schedule 29.01.2020
comment
Спасибо за ваш интерес. Я отредактировал свой пост сейчас с анализом Solr. Я уже делал это раньше, но не мог ничего из этого вывести.   -  person Maputo    schedule 29.01.2020
comment
Думаю, теперь я понял. После PatternFilter 15.6 " по-прежнему остается одним токеном, и явно 15.6 " не совпадает с ". Есть ли способ обойти это?   -  person Maputo    schedule 29.01.2020


Ответы (1)


Проблема в том, что 15.6 " по-прежнему остается одним токеном после того, как ваш фильтр замены шаблона - простое создание токена с пробелом не приведет к его разделению.

Вы можете видеть, что он по-прежнему хранится как один токен, так как в строке нет | (которая разделяет токены).

Добавьте после него фильтр Word Delimiter (судя по вашей цепочке анализа, он у вас уже есть, просто он не включен в ваш вопрос), или, лучше, сделайте замену в PatternReplaceCharFilterFactory до токенизатора задача разбить ввод на отдельные токены:

<analyzer>
  <charFilter class="solr.PatternReplaceCharFilterFactory" pattern='^([0-9]+([,.][0-9]+)?)(")$' replacement="$1 $3" />
  <tokenizer ...>

Возможно, вам придется немного помассировать средство сопоставления с образцом (т.е. потерять ^ и $, которые Solr в любом случае не соблюдает, iirc) в зависимости от вашего ввода (поскольку теперь он будет применяться ко всей входной строке - убедитесь, что «Macbook 15.6» 256 ГБ соответствует соответствию).

person MatsLindh    schedule 29.01.2020
comment
Я пытался выполнить сопоставление с образцом перед токенизацией, но кажется, что Solr сначала автоматически вызывает токенизаторы. Я также пытался добавить еще один токенизатор, но Солру это не понравилось. - person Maputo; 29.01.2020
comment
Вы должны добавить его как charFilter. Это важно. Если вы просто добавите фильтр, он будет вызываться последовательно после токенизатора. Сначала применяются фильтры Char, затем токенизатор, затем фильтры. WordDelimiterGraphFilter также может выполнять некоторые операции, которые может выполнять токенизатор. - person MatsLindh; 29.01.2020