Haystack + Xapian:无法使自动完成功能正常工作

时间:2014-07-24 14:53:35

标签: python django autocomplete django-haystack xapian

我试图在我的服务器上运行自动完成功能以进行搜索。以下是我的一个索引器类的示例:

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,但这给了我类似的结果。

1 个答案:

答案 0 :(得分:0)

我相信Haystack文档建议 EdgeNgramField 用于"标准文本,"我假设是英语。对于亚洲语言,他们建议使用 NgramField ,或者如果您想跨越字边界匹配。即,我认为您希望 content_auto 使用 EdgeNgramField

 content_auto = indexes.EdgeNgramField(use_template=True)

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

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

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

有关使用后端和弹性搜索的自定义n-gram设置的信息,请参阅此问题: