Solr - KeywordTokenizerFactory - 多个单词的完全匹配不起作用

时间:2016-05-24 23:00:22

标签: solr tokenize solr5

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

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

我添加了价值&#34;紧身牛仔裤&#34;到我的索引。

当我运行以下搜索查询(为阅读解码的网址)时,我得到无结果

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

您可以看到网址正在搜索所有内容(*:*),并带有针对确切值&#34; skinny jeans&#34;的过滤查询。

然后我添加价值&#34;牛仔裤&#34;到我的索引,并使用

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

找到&#34;牛仔裤&#34;元件。

因此它适用于单个单词,但不适用于多个单词。为什么会这样?毕竟我正在寻找一个确切的值。这让我怀疑KeywordTokenizerFactory正在做一些奇怪的事情。任何人都可以建议为什么没有从这样的基本设置返回结果?

谢谢,

1 个答案:

答案 0 :(得分:1)

这是因为您正在使用KeywordTokenizerFactory进行索引,以保持单词不变。不应用任何标记或不创建任何标记。但是查询时你正在使用WhitespaceTokenizerFactory为空白创建令牌。

因此,KeywordTokenizerFactory会在{1}中使用"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分析工具检查在使用solr分析工具查询时创建的索引和令牌时创建的令牌。