【问题标题】:Haystack + Xapian: Can't get autocomplete functionality workingHaystack + Xapian:无法使自动完成功能正常工作
【发布时间】:2014-07-24 14:53:35
【问题描述】:

我正在尝试在我的服务器上进行自动完成以进行搜索。这是我的索引器类之一的示例:

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    artist_name = indexes.CharField(model_attr='clean_artist_name', null=True)
    submitted_date = indexes.DateTimeField(model_attr='submitted_date')
    total_count = indexes.IntegerField(model_attr='total_count')

    # This is used for autocomplete
    content_auto = indexes.NgramField(use_template=True)

    def get_model(self):
        return Artist

    def index_queryset(self, using=None):
        """ Used when the entire index of a model is updated. """
        return self.get_model().objects.filter(date_submitted__lte=datetime.now())

    def get_updated_field(self):
        return "last_data_change"

textcontent_auto 字段使用模板填充,在 Artsts 的情况下,模板只是艺术家姓名。根据文档,这样的东西应该适用于自动完成:

objResultSet = SearchQuerySet().models(Artist).autocomplete(content_auto=search_term)

但是,使用字符串“bill w”尝试此操作会返回 Bill Stephney 作为顶部结果,然后是 Bill Withers 作为第二个结果。这是因为 Bill Stephney 在数据库中有更多记录,但 Stephney 不应该匹配这个查询:一旦检测到“w”,它应该只匹配 Bill Withers(和其他 Bill Ws)。我也尝试过通配符:

objResultSet = SearchQuerySet().models(Artist).filter(content_auto=search_term + '*')

objResultSet = SearchQuerySet().models(Artist).filter(text=AutoQuery(search_term + '*'))

但通配符似乎会导致大量问题,由于带有神秘堆栈跟踪的Write Failed: Broken Pipe 错误,开发服务器挂起并最终停止,所有这些都在 Python 框架内。有没有人设法让它正常工作? NgramField 是正确使用的类型吗?我尝试过使用 EdgeNgramField,但结果相似。

【问题讨论】:

    标签: python django autocomplete django-haystack xapian


    【解决方案1】:

    我相信 Haystack 文档推荐 EdgeNgramField 用于“标准文本”,我假设它是英文的。他们建议将 NgramField 用于亚洲语言,或者如果您想跨单词边界进行匹配。即,我认为您希望您的 content_auto 使用 EdgeNgramField

     content_auto = indexes.EdgeNgramField(use_template=True)
    

    此外,由于 n-gram 并不完全是通配符搜索(例如,我们在 shell 脚本 glob 匹配中使用 * [星号]),因此您不应在过滤器中使用 *。

    我发现对搜索结果产生影响的一件事是您可以在后端引擎中调整的参数——n-gram 标记器和 n-gram 过滤器的设置。根据您使用的搜索引擎后端,更改 min_gram 值将影响您在匹配中获得的结果。

    我只使用了 elasticsearch 后端,所以我不知道其他后端是否像 solr/elasticsearch 那样对这些 n-gram 设置敏感。基本上,我基于 haystack 附带的默认后端创建了一个自定义后端,并调整了 min_gram 值以测试匹配。您设置的值越高,匹配就越“准确”,因为它必须匹配更长的标记。

    请参阅此问题,了解如何使用带有自定义 n-gram 设置的后端进行弹性搜索:

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多