首页 > 解决方案 > Solr 和 Haystack 带空格的自动完成功能

问题描述

我正在尝试使自动完成/自动建议功能正常工作,但遇到了 Haystack(最新大师)和 Solr(6.6.6)的问题。

我正在使用 Haystack 的autocomplete()函数,它要求索引字段是 EdgeNgram(或 Ngram)。自动完成查询工作正常,直到我有一个空格并开始第二个单词的开头。

例如:

但是,一旦我到达一个空格和第二个单词的开头,我就没有得到任何结果:

从我目前的调查来看,这似乎是因为 Haystack 正在将两个词短语转换为基于 AND 的两个词查询。“星与 w”,或(AND: ('title', 'star'), ('title', 'w')). AND 运算符和不是有效词干的第二个查询词“w”的组合意味着不返回任何结果。

我可以覆盖 Haystacks 自动完成功能以使用 OR 运算符来部分解决此问题...

但是,有没有更好的方法/解决方案?

理想情况下,我希望搜索“star w”以返回“星球大战”(而不是所有以 W 开头的电影,这可能是 OR 运算符导致的)。

其他搜索功能似乎运行良好,因此这不是一般配置问题 - 但似乎特定于自动完成查询/用例的性质。

如何配置 Solr / 使用 Haystack 来获得所需的自动完成响应,这些响应跨越两个带有空格的单词?

标签: djangosearchsolrautocomplete

解决方案


您可以使用以下字段类型作为建议字段。然后,您可以在查询时使用通配符: star w*

<fieldType name="suggestionFieldType" class="solr.TextField" sortMissingLast="true" omitNorms="true">
      <analyzer>
        <!-- KeywordTokenizer does no actual tokenizing, so the entire
             input string is preserved as a single token
          -->
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <!-- The LowerCase TokenFilter does what you expect, which can be
             when you want your sorting to be case insensitive
          -->
        <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
    </fieldType>

或者您也可以尝试为您的字段使用以下字段类型。在下面的情况下

可接受的部分搜索短语是:

s
st
sta
star
star w
star wa

等等...

<fieldType name="suggestion_text" class="solr.TextField" positionIncrementGap="100">    
  <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/>       
       <filter class="solr.EdgeNGramFilterFactory" maxGramSize="100"/> 
  </analyzer>
  <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory" /> 
  </analyzer> 
</fieldType>

推荐阅读