如何使用Django-Haystack for TextField与html

时间:2014-04-26 05:46:21

标签: indexing django-haystack

我使用Haystack索引内部有html的字段,我想确认我所做的事情是有道理的,因为这个索引业务对我来说很近。

考虑以下模型:

class Document(models.Model):
    name = models.CharField(max_length=200)
    date = models.DateField()

    text = models.TextField()  # has html
    summary = models.TextField() # has html

    def compose_summary(self):
        # searches for tags in html and substitute for other tags (for rendering)

    def visible_summary(self):
        # returns summary without html.

    def visible_text(self):
        # returns text without html.

我想创建一个SearchIndex。特别是我想将搜索结果总结为:

<h4><a href="{{ law.get_absolute_url }}">{{ law.name }}</a></h4>
<div class="age">{{law.date}}</div>
<p>{{ law.compose_summary|safe }}</p>

我想在所有领域进行搜索。

我现在的做法是:

class DocumentIndex(indexes.SearchIndex, indexes.Indexable):
    id = indexes.IntegerField(model_attr='id', indexed=False) # for get_absolute_url
    name = indexes.CharField(model_attr='name', indexed=False)
    date = indexes.DateField(model_attr='date')

    text = indexes.CharField(document=True, use_template=True)
    summary = indexes.DateField(model_attr='summary', indexed=False)

    def get_model(self):
        return Document

    def compose_summary(self):
        # copy of Document.compose_summary().
    def get_absolute_url(self):
        # copy of Document.get_absolute_url().

# document_text.txt
{{ object.name }}
{{ object.visible_summary }}
{{ object.visible_text }}

但是,我不确定这是正确的方法:我在至少两种情况下(函数)重复代码,我认为这是存储摘要的内容三次:一次在数据库(Document.summary),DocumentIndex.summary中的一个和DocumentIndex.text内的一个。有人可以给我一个提示是否有意义吗?

1 个答案:

答案 0 :(得分:0)

解决您的两个问题:

  • 无需重复DocumentIndex对象中的代码,您可以通过例如访问相关的Document对象。 {{ law.object.get_absolute_url }}所以请将代码放在Document

  • 是的,summary将被存储三次,一次存储在数据库中,两次存储在索引中,没有任何问题。仅供参考,DocumentIndex.text将通过您的模板填充,因此它不仅包含摘要,还包含您想要编入索引的所有内容。