【问题标题】:Django Haystack autocomplete does not work as expectedDjango Haystack 自动完成功能无法按预期工作
【发布时间】:2016-08-16 13:47:46
【问题描述】:

Django==1.8.13,elasticsearch==1.7.1

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

sqs = sqs.autocomplete(name=query)

名称搜索索引:

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

没有对查询集进行排序。

搜索查询:'字体'

结果:

-> 很棒的字体

-> 其他一些值

-> 字体真棒

预期结果:

-> 字体真棒

-> xxxx(其他值)

-> xxxx(其他值)


为什么“Font Awesome”没有排在列表的首位?

如果我使用 NgramField 而不是 CharField,值会上升到第二位。但它仍然不正确,因为以查询开头的单词的值应该放在第一位。

【问题讨论】:

    标签: django elasticsearch autocomplete django-haystack


    【解决方案1】:

    您不能将CharFieldsqs.autocomplete() 一起使用。来自documentation

    您有两个选择:NgramFieldEdgeNgramField。虽然很 类似,字段的选择有些重要。

    • 如果您使用标准文本,EdgeNgramField 会在空白处进行标记。当两个不同的部分的一部分时,这可以防止不正确的匹配 单词被组合成一个 n-gram。这是大多数用户的 应该使用。
    • 如果您正在使用亚洲语言或希望能够跨单词边界自动完成,NgramField 应该是您的选择 使用。

    您需要将name 索引字段更改为EdgeNgramField,或者(如果您在其他地方使用name)创建一个用于自动完成搜索的单独字段,例如:

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

    然后查询:

    sqs = sqs.autocomplete(autocomplete_name=query)
    

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

    【讨论】:

    • 使用 EdgeNgramField 将值排在第三位。
    猜你喜欢
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2014-02-26
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多