无法使用弹性搜索后端获得“更像这样”以在Haystack中返回任何结果

时间:2014-05-13 14:27:25

标签: python django elasticsearch django-haystack

我似乎无法在Haystack中获取more_like_this标记以返回任何结果。不确定是否归结于我输入的数据,但我已经尝试了一些非常相似的文档。

我已经证实即使使用这样一个非常简单的索引它也不起作用:

class PaperIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return Paper

简化模型再次如下:

class Paper(Publishable):
    title = models.CharField(max_length=255)
    abstract = models.TextField()

    def __unicode__(self):
        return self.title

搜索模板如下所示:

{% autoescape off %}
{{ object.title }}
{{ object.abstract|striptags }}
{% endautoescape %}

目前我只是希望看到标签返回的结果如下:

{% more_like_this paper as related_papers limit 1 %}
{{ related_papers }}

不确定我还有什么需要做的。 elastic search docs提到“为了使用mlt功能,需要存储mlt_field,需要启用store term_vector或source。”但是我不确定在干草堆术语中它等同于什么。

我应该注意到我没有看到任何错误 - 只是我从more_like_this返回一个空的列表/结果集。

哦,Elastic Search是版本1.1.1。

1 个答案:

答案 0 :(得分:0)

老问题,但仍然是一个反复出现的问题。

解决方案很简单:在弹性搜索的搜索模板中提供足够的信息,以便能够计算相似度。

如果您有标签,完整说明,流派,语言或其他可用于查找匹配项的内容,请将其添加到搜索模板中。

要添加列表(例如标签),您可以在搜索模板中执行以下操作:

{% load search_tags %}
{% render_tags object %}

search_tags添加名为render_tags的模板标记:

from django.template import Library
from django.utils.safestring import mark_safe

register = Library()


@register.simple_tag
def render_tags(obj):
    return mark_safe(' '.join([t.tag for t in obj.tags.all()]))

这假设您对模型中的标记有一个ManyToMany关系。