如何通过短词进行Solr搜索?

时间:2018-06-22 14:12:33

标签: solr sunspot sunspot-rails sunspot-solr

我有一个显示“ 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的大小看起来像暗室?

2 个答案:

答案 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的参数,因此,如果第一个失败,请尝试使用该参数。

这将需要重新索引您的内容,以便为您的文档提供新的令牌。