elasticsearch 自定义Django ListView分页

sz81bmfz  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(121)

我正在为搜索视图实现Django ListView。使用Elasticsearch和django-elasticsearch-dsl进行搜索。我实际上得到了一个只有10个项目的分页,因为这是Elasticsearh默认回答的内容数量。我可以要求elasticsearch得到所有的内容,但这将是真的unnefficient,因为我只显示像50他们。
Django有没有办法从查询集以外的地方读取分页信息?
这就是我的观点:

from .elastic import search

class SearchView(ListView):
   template_name = "search/index.html"
   paginate_by = 50

   def get_queryset(self):
      keyword = self.kwargs['keyword']
      lang = get_language()
      return search(keyword, lang)

字符串

编辑:

当使用数据库中的普通查询集时,django管理分页,我假设使用查询来计数对象的总数并使用paginate_by参数。在我的例子中,我在get_queryset方法上返回的queryset只有一个页面长度,因为我从elasticsearch获取这些内容。我正在寻找一种方法来告诉django查询总共有多少内容,让django构建分页。
我的搜索方法是一个对elasticsearch的查询,它返回一个查询集中的一页内容。但它不会返回所有内容。我有搜索结果的总量,但我不知道在哪里放置该变量,以允许Django构建分页。

u59ebvdq

u59ebvdq1#

我有点晚了,但我是为了那些在这里着陆的人。这里的问题是Elasticsearch返回paginate_by结果,因此Listview paginator将尝试对这50个结果进行分页。因此,第2页将始终返回“无结果”。
所以这里的想法是让分页器总是返回1,并在ElasticSearch上处理分页:

from django.core.paginator import Paginator

class SinglePagePaginator(Paginator):
    def validate_number(self, number):
        return 1

字符串
Then your listView

class MyListView(ListView):
    model = MyModel
    ...
    paginate_by = 10
    paginator_class = SinglePagePaginator
    
    def get_queryset(self):
            # Query Elasticsearch
            search = Search(index='index_name')
            multi_match = MultiMatch(query=query, fields=['field_name'])
            search = search.query(multi_match)

            # Adjust start and size of results
            search = search.extra(from_=start_from, size=page_size)
            response = search.execute()


因此,默认分页总是返回1,但您在Elasticsearch上处理它。
另一种方法是从ElasticSearch加载所有结果,但它可能会占用大量内存。

相关问题