【问题标题】:Multiple requests to backend because of Pagination in Django Haystack由于 Django Haystack 中的分页,对后端的多个请求
【发布时间】:2015-07-22 08:24:05
【问题描述】:

我使用 Elasticsearch 作为我的后端。

在我的一个观点中,我做了一个这样的过滤器:

SearchQuerySet().filter(...)

它返回,比如说,55 个对象。

然后,我在 for 循环中迭代结果以对每个对象执行一些操作。

结果符合预期。但是,当我查看 elasticsearch 的日志时,我会看到如下内容:

[12:38:16,504] {"time":"2015-07-22T12:38:16.504+05:00","starttime":"2015-07-22T12:38:16.502+05:00","localaddr":"127.0.0.1","localport":9200,"remoteaddr":"127.0.0.1","remoteport":58718,"scheme":"http","method":"GET","path":"/haystack/modelresult/_search","querystr":"_source=true","code":200,"status":"OK","size":13633,"duration":2,"year":"2015","month":"07","day":"22","hour":"12","minute":"38","dow":"Wed","cluster":"elasticsearch_venta","data":"{\"query\": {\"filtered\": {\"filter\": {\"terms\": {\"django_ct\": [\"items.item\"]}}, \"query\": {\"match_all\": {}}}}, \"from\": 0, \"size\": 10}"}
[12:38:16,509] {"time":"2015-07-22T12:38:16.509+05:00","starttime":"2015-07-22T12:38:16.508+05:00","localaddr":"127.0.0.1","localport":9200,"remoteaddr":"127.0.0.1","remoteport":58718,"scheme":"http","method":"GET","path":"/haystack/modelresult/_search","querystr":"_source=true","code":200,"status":"OK","size":13719,"duration":1,"year":"2015","month":"07","day":"22","hour":"12","minute":"38","dow":"Wed","cluster":"elasticsearch_venta","data":"{\"query\": {\"filtered\": {\"filter\": {\"terms\": {\"django_ct\": [\"items.item\"]}}, \"query\": {\"match_all\": {}}}}, \"from\": 10, \"size\": 10}"}
[12:38:16,515] {"time":"2015-07-22T12:38:16.515+05:00","starttime":"2015-07-22T12:38:16.513+05:00","localaddr":"127.0.0.1","localport":9200,"remoteaddr":"127.0.0.1","remoteport":58718,"scheme":"http","method":"GET","path":"/haystack/modelresult/_search","querystr":"_source=true","code":200,"status":"OK","size":13429,"duration":2,"year":"2015","month":"07","day":"22","hour":"12","minute":"38","dow":"Wed","cluster":"elasticsearch_venta","data":"{\"query\": {\"filtered\": {\"filter\": {\"terms\": {\"django_ct\": [\"items.item\"]}}, \"query\": {\"match_all\": {}}}}, \"from\": 20, \"size\": 10}"}

也就是说,SearchQuerySet 每次返回 10 个项目。

我尝试了load_all,但没有帮助。

我认为这是因为 SearchQuerySet 返回了分页结果。

如何将 elasticsearch 的请求数量减少到一个,即一次获取所有项目?

【问题讨论】:

    标签: python django elasticsearch pagination django-haystack


    【解决方案1】:

    在 SearchView 中将 results_per_page 设置为 None。 SearchView 在官方 repo 中定义如下:

    class SearchView(object):
        ...
        results_per_page = RESULTS_PER_PAGE
    

    【讨论】:

    • 我没有进行搜索。我正在使用 SearchQuerySet() 进行过滤:(
    【解决方案2】:
    SearchQuerySet().filter(...).query.get_results()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2015-09-21
      • 1970-01-01
      • 2013-03-09
      • 2011-06-14
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多