繁体   English   中英

为什么每次在django-haystack的搜索视图中调用index_queryset?

[英]Why is index_queryset called every time from search view in django-Haystack?

我遵循了“ 入门-Django Haystack”示例,将它们的模型替换为我的模型。 在search_indexes.py中,方法index_queryset带有注释“在更新模型的整个索引时使用”。 但是,每次我从视图search / search.html执行搜索时都会调用它

该方法本身从数据库中获取所有对象,并且速度很慢,因此我认为这不是预期的行为。

search_indexes.py

import datetime
from haystack import indexes
from article.models import Article


class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    article_id = indexes.IntegerField(model_attr='id')
    title = indexes.CharField(model_attr='title')
    summary = indexes.CharField(model_attr='summary')
    content = indexes.CharField(model_attr='content')
    published_at = indexes.DateTimeField(model_attr='published_at')

def get_model(self):
    return Article

def index_queryset(self, using=None):
    return self.get_model().objects.filter(
        published_at__lte=datetime.datetime.now())

我捕获了堆栈跟踪以查看从何处调用它:

python2.7/site-packages/haystack/views.py(53)__call__()
-> return self.create_response()
python2.7/site-packages/haystack/views.py(133)create_response()
-> (paginator, page) = self.build_page()
python2.7/site-packages/haystack/views.py(110)build_page()
-> self.results[start_offset:start_offset + self.results_per_page]
python2.7/site-packages/haystack/query.py(272)__getitem__()
-> self._fill_cache(start, bound)
python2.7/site-packages/haystack/query.py(191)_fill_cache()
-> to_cache = self.post_process_results(results)
python2.7/site-packages/haystack/query.py(214)post_process_results()
-> objects = index.read_queryset(using=self.query._using)
python2.7/site-packages/haystack/indexes.py(144)read_queryset()
->   return self.index_queryset(using=using)
myApplication/article/search_indexes.py(20)index_queryset()
->   return self.get_model().objects.filter(

注意:我正在使用django版本1.7.10和django-haystack版本2.4.1

这是预期的行为-错误的是文档字符串。 函数index_queryset基本上返回Haystack用于获取搜索结果(以及索引文档)的查询集。

你说:

该方法本身从数据库中获取所有对象,并且非常慢

其实不是。 该方法所做的只是返回一个查询集。 查询集是惰性的 ,因此该方法不会访问数据库。 仅当尝试访问查询集的结果时,数据库才会被命中。

这将在您执行搜索并且Haystack返回结果之后发生。 此时,将进一步过滤查询集以返回与搜索匹配的对象。 如果这很慢,则表明您的模型结构存在更根本的性能问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM