python - 使用 Elasticsearch 后端使 “more like this”无法在Haystack中返回任何结果

标签 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,需要启用存储term_vector或源。”但是我不确定这在Haystack术语中意味着什么。

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

哦,Elastic Search是1.1.1版。

最佳答案

旧问题,但仍然是反复出现的问题。

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

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

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

{% 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关系。

关于python - 使用 Elasticsearch 后端使 “more like this”无法在Haystack中返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23634065/

相关文章:

python : Split string separated by a pipe symbol "|"

Python 脚本不会在键盘快捷键上运行

python - 如何在django中更改上传文件的名称和存储位置

django - Django 模型中的密码字段

Elasticsearch 按 : element presence in the array and date 排序

elasticsearch - 弹性 2.3.4。节点启动安静失败

python - 如何根据某种等价关系从矩阵列表中删除重复项?

python - 在 python 中使用 **kwargs 和 SimpleXMLRPCServer

python - Django - 在生产中提供媒体/上传文件

elasticsearch - 哪个DSL对执行预过滤查询是正确的?