Django haystack搜索html标签返回所有帖子

时间:2017-07-10 22:11:01

标签: python django elasticsearch django-haystack

我有一个django应用程序(博客)我试图用elasticsearch实现django haystack。我遇到的问题是,在通过搜索<p><html>来测试搜索功能时,我不希望有任何结果,但它会返回我的所有帖子。这是我的应用程序/模型的样子:

博客/ models.py

class Posts(models.Model):
    title = models.CharField(max_length=200, unique=True)
    html_content = models.TextField(blank=True, null=True)
    markdown_content = models.TextField(blank=True, null=True)
    date_created = models.DateTimeField(auto_now=False, auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    tags = models.ManyToManyField(Tag, through='PostTags')

    def save(self, *args, **kwargs):
        self.html_content = markdown.markdown(
            self.markdown_content,
            ["markdown.extensions.extra", "codehilite"]
        )
        super(Posts, self).save(*args, **kwargs

博客/ search_indexes.py

from haystack import indexes


from .models import Posts


class PostsIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(
        model_attr='text',
        document=True,
        use_template=True
    )
    title = indexes.CharField(model_attr='title')
    markdown_content = indexes.CharField(
        model_attr='markdown_content',
        null=True,
        indexed=False
    )

    html_content = indexes.CharField(
        model_attr='html_content',
        null=True,
        indexed=False
    )

    def get_model(self):
        return Posts

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

现在我假设当我搜索<p><html>返回我的所有帖子因为我在数据库中保存html标签时,我错了吗?如果是这样,我如何指定忽略任何html标签?

我还尝试使用indexes.ModelSearchIndex并排除字段html_content,但搜索html标签似乎会返回所有帖子...有谁能告诉我我做错了什么?

我是django-haystack和elasticsearch的新手,所以如果我做了一些非常基本的错误,我会事先道歉并感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我怀疑问题是您正在修改索引条件(在PostsIndex中),但您仍在对先前创建的索引执行搜索,该索引仍然具有HTML标记。尝试运行Haystack的rebuild_index management command。在对索引配置进行每次更改之后执行此操作,直到您对该行为感到满意为止。

另一种可能性是Elasticsearch配置为忽略搜索查询中的<>等元字符,因此产生的结果超出预期。