问题描述
我正在尝试使自动完成/自动建议功能正常工作,并且遇到了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>