我有一个显示“ 4k显示”的项目,当我搜索“ 4k显示”时,该项目似乎没有被优先处理,其他带有“显示”(没有4k)的项目出现了。
如果我搜索“ 4k”,则不会显示任何内容。
我应该在配置中进行哪些更改以解决此问题?
更新:这是文本类型部分的外观,可能是黑子宝石所设置的。
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<!--<filter class="solr.StandardFilterFactory"/>-->
<filter class="solr.LowerCaseFilterFactory"/>
<!--<filter class="solr.KStemFilterFactory"/>-->
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="7"/>
</analyzer>
</fieldType>
minGram的大小看起来像暗室?
答案 0 :(得分:2)
因此,让我们遍历您的分析链。 首先是Standard Tokenizer。它将在空白处分割。 因此,“ 4K显示”将分为两个令牌
4k,显示
下一个是lowercaseFilter。这会降低令牌的大小写,因此在这种情况下,因为已经小写,所以没有任何变化。因此,在此步骤结束时,您仍然拥有相同的两个令牌
4k,显示
现在出现了NGramFilterFactory,它将开始创建这样的令牌。 因此,例如,如果您有一个名为“ abcd”的令牌
Ngram会产生这样的令牌。
a,ab,abc,abcd,b, bc,bcd,c,cd,d
但是在ngram字段类型中定义了另一个选项
minGramSize =“ 3” maxGramSize =“ 7”
这意味着仅保留最小长度为3且最大长度为7的令牌。 所以在上面的示例中,您只会看到
abc,abcd,bcd
到目前为止,对我来说。
现在,将其应用于您的案例。经过小写过滤后,我们有了两个令牌
4k,显示
同时应用Ngram会产生以下结果
4,4k,k,d,di,dis,disp,displ,displa,display,i,isp等。你得到 这个想法。
但是由于miggram的大小为3。4和4k将从您的索引中删除。因此,您将无法使用4k搜索。因为它从来没有在索引中。
您的索引仅具有以dis
开头的值,例如
dis,disp,displ,displa,display
为了解决此问题。首先,您需要了解如何搜索数据。
您真的需要NGRamtokenizer吗?
例如,如果您只是想获得完全匹配的内容。例如,当您查询“ 4k显示”时,只需要具有“ 4k”或“显示”或“ 4k显示”的结果,则需要更改分析链。
在这种情况下,请从您的分析链中注释掉NGram,然后重新索引并尝试再次查询。
答案 1 :(得分:1)
您的NGramFilter配置为仅保留至少具有三个字符的令牌:
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="7"/>
4k
只有两个,因此过滤器不会为该输入生成任何标记。如果您希望它仍然保留4k
,即使它不够长,也可以尝试将preserveOriginal="true"
添加到参数中(根据filterfactory中的javadoc,但是代码似乎在寻找一个名为keepShortTerm
的参数,因此,如果第一个失败,请尝试使用该参数。
这将需要重新索引您的内容,以便为您的文档提供新的令牌。