Solr - KeywordTokenizerFactory - 多个单词的精确匹配不起作用

Solr - KeywordTokenizerFactory - Exact Match for Multiple Words Not Working

我在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>

它应该逐字索引值(没有标记化)。

我将值 "skinny jeans" 添加到我的索引中。

当我运行以下搜索查询(url解码阅读)我得到没有结果:

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

您可以看到 URL 正在搜索所有内容 (*:*),并通过过滤器查询精确值 "skinny jeans"。

然后我将值 "jeans" 添加到我的索引,运行 与

的类似查询
&fq=name:("jeans")

然后我 找到 "jeans" 元素。


所以它适用于单个单词,但不适用于多个单词。为什么会这样?毕竟我正在寻找一个精确的值。这让我怀疑 KeywordTokenizerFactory 正在做一些奇怪的事情。谁能告诉我为什么没有从这样的基本设置返回结果?

谢谢,

这是因为您正在使用 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分析工具查看索引时创建的token和查询时创建的token。