django - Solr 和 Haystack 带空格的自动完成功能
问题描述
我正在尝试使自动完成/自动建议功能正常工作,但遇到了 Haystack(最新大师)和 Solr(6.6.6)的问题。
我正在使用 Haystack 的autocomplete()
函数,它要求索引字段是 EdgeNgram(或 Ngram)。自动完成查询工作正常,直到我有一个空格并开始第二个单词的开头。
例如:
- "st" 产生 [" Star Wars", " Star arlight Express"...]
- "wa" 产生 ["Star Wars " , " Waterworld "...]
- “星”产生[“星球大战”、“星光快车”...]
但是,一旦我到达一个空格和第二个单词的开头,我就没有得到任何结果:
- "star w" 没有结果
从我目前的调查来看,这似乎是因为 Haystack 正在将两个词短语转换为基于 AND 的两个词查询。“星与 w”,或(AND: ('title', 'star'), ('title', 'w'))
. AND 运算符和不是有效词干的第二个查询词“w”的组合意味着不返回任何结果。
我可以覆盖 Haystacks 自动完成功能以使用 OR 运算符来部分解决此问题...
但是,有没有更好的方法/解决方案?
理想情况下,我希望搜索“star w”以返回“星球大战”(而不是所有以 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>
推荐阅读
- sql-server - SQL Server 2016 安装冻结在 install_vc10redist_cpu64_action
- python - Python pygame添加球与障碍物碰撞
- excel - 如何在excel中间搜索一个值以获取变化的值?
- winapi - 如何使用 FileAPI 重现 ERROR_WRITE_PROTECT?
- c# - 如何使用 NAudio 从 UDP 数据包播放音频流?
- c - 为什么实际文件大小远小于通过 C 中的 TCP 套接字接收的数据?
- sql - 如何索引和分区表
- powerbi - 使用 Power BI pro 创建 SQL Server 数据集
- performance - Azure Application Insights 查询以显示时间频率
- javascript - 动作没有收到正确的道具