Solr和Haystack使用空格自动完成

问题描述

我正在尝试使自动完成/自动建议功能正常工作,并且遇到了Haystack(最新版本的主机)和Solr(6.6.6)的问题。

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

例如:

  • “ st”产生[“ St ar Wars”,“ St arlight Express” ...]
  • “ wa”产生[“ Star Wa rs”,“ Wa terworld” ...]
  • “星”产生[[大战”,“ 轻快” ...]

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

  • “星号w”没有结果

到目前为止,从我的调查来看,这似乎是因为Haystack将两个单词的短语转换为基于AND的两个单词的查询。 “星号AND w”或(AND: ('title','star'),('title','w'))。 AND运算符与第二个查询词“ w”(不是有效的词干)的组合表示没有结果返回。

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

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

理想情况下,我希望搜索“ star w”以返回“ star wars”(并不是所有以W开头的电影,这是OR运算符可能引起的)。

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

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

解决方法

您可以在字段类型下方使用“建议字段”。 然后,您可以在查询时使用通配符: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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...