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