我在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正在做一些奇怪的事情。任何人都可以建议为什么没有从这样的基本设置返回结果?
谢谢,
答案 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分析工具查询时创建的索引和令牌时创建的令牌。