2016-08-16 72 views
0

Django == 1.8.13,elasticsearch == 1.7.1Django Haystack自动完成功能无法正常工作

我正在名称字段上实现自动完成功能。对于名称

sqs = sqs.autocomplete(name=query) 

搜索索引:

name = indexes.CharField(model_attr='name', boost=1.2) 

没有排序的查询集来完成。

搜索查询: '字体'

结果:

- >大字体

- >其他一些价值

- >字体真棒

预期结果:

- > Font Awesome

- > XXXX(其它值)

- > XXXX(其它值)


为什么不 “字体真棒” 是第一位的列表中?

如果我使用NgramField代替CharField,价值颠簸到第二位。但它仍然不正确,因为以字开头的值应该首先出现。

回答

0

您不能使用sqs.autocomplete()一个CharField。从documentation

您有两种选择:NgramFieldEdgeNgramField。虽然非常类似,但是场的选择有点重要。

  • 如果您使用的是标准文本,EdgeNgramField会以空格为标记。这样可以防止两个不同的 单词的一部分作为一个n-gram拼凑在一起时错误匹配。这是大多数用户使用的应用程序 。
  • 如果你使用亚洲语言的工作还是希望能够跨越字边界自动完成,NgramField应该是什么你 使用。

无论您需要在name索引字段更改为EdgeNgramField或者(如果您正在使用name别处)创建一个单独的字段,用于自动完成搜索,例如:

autocomplete_name = indexes.EdgeNgramField(model_attr='name') 

然后查询:

sqs = sqs.autocomplete(autocomplete_name=query) 

这应该会给你预期的结果。

+0

使用EdgeNgramField结果值在第3位。 –

相关问题