2017-07-10 103 views
1

我有一個django應用程序(博客),我試圖用elasticsearch實現django乾草堆。我遇到的問題是,當通過搜索<p><html>來測試搜索功能時,我並不期望得到任何結果,但它會返回我的所有帖子。這裏是我的應用程序/模型的樣子:Django乾草堆搜索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的新手,所以如果我正在做一些非常基本的錯誤,我會事先道歉並感謝您的幫助。

回答

0

我懷疑問題是您正在修改您的索引條件(在PostsIndex),但您仍然對先前創建的索引執行搜索,該索引仍具有HTML標記。嘗試運行Haystack的rebuild_index management command。在對索引配置進行每次更改之後執行此操作,直到您對該行爲感到滿意爲止。其他

一種可能性是,Elasticsearch被配置爲忽略元字符,如在搜索查詢<>,比你想到的是因此產生更多的結果。

相關問題