Solr — KeywordTokenizerFactory — Точное совпадение для нескольких слов не работает

Я сделал следующее определение типа в Solr:

<fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  </analyzer>    
</fieldType>

Он должен индексировать значения дословно (без токенизации).

Я добавляю значение «узкие джинсы» в свой индекс.

Когда я запускаю следующий поисковый запрос (URL-адрес декодирован для чтения), я не получаю никаких результатов:

http://myvm:8983/solr/mycore/select?q=*:*&fq=name:("skinny jeans")&wt=json&indent=true&debugQuery=true

Вы можете видеть, что URL-адрес ищет все (*:*) с запросом фильтра для точного значения «джинсы скинни».

Затем я добавляю значение «джинсы» в свой индекс и запускаю аналогичный запрос с

&fq=name:("jeans")

И я нахожу элемент "джинсы".


Так что это работает для одного слова, но не для нескольких слов. С чего бы это? В конце концов, я ищу точное значение. Это заставляет меня подозревать, что KeywordTokenizerFactory делает что-то странное. Может ли кто-нибудь посоветовать, почему из такой базовой настройки не возвращаются результаты?

Спасибо,


person mils    schedule 24.05.2016    source источник


Ответы (1)


Это потому, что вы используете KeywordTokenizerFactory для индексации, которая сохраняет слово как есть. Не применяет токенизацию и не создает токены. Но при запросе вы используете WhitespaceTokenizerFactory, который создает токены для пробелов.

Таким образом, KeywordTokenizerFactory будет иметь токен, подобный "skinny jeans", как одиночный токен в индексе.

WhitespaceTokenizerFactory создаст токены вроде "skinny", "jeans".

Вы видите разницу, она не совпадет. Вы ищете "skinny", "jeans" против "skinny jeans".

Вам нужно либо изменить токенизатор индекса, либо токенизатор запроса.

Если вы хотите добиться точного совпадения, сохраните KeywordTokenizerFactory для обоих, как в токенизаторе, при индексировании и запросе, как показано ниже.

<fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
  </analyzer>    
</fieldType>

Вы можете проверить токен, созданный при индексировании, и токен, созданный при запросе, с помощью инструмента анализа solr.

person Abhijit Bashetti    schedule 25.05.2016
comment
Ах, кажется, я понимаю, вы хотите сказать, что хотя в своем запросе я дважды заключил фразу «джинсы скинни» в кавычки, на самом деле она будет запрашиваться не как фраза, а как отдельные токены? - person mils; 25.05.2016
comment
Если бы я использовал WhitespaceTokenizerFactory и ShingleFilterFactory на стороне запроса, мог бы я получить результаты, аналогичные тем, которые мне нужны? - person mils; 25.05.2016
comment
@mils: Не очень уверен в этом ... Но да, попробуйте, создав fieldType и применив его к полю ... Лучший способ - проанализировать то же самое на странице / инструменте анализа solr ... - person Abhijit Bashetti; 25.05.2016