Django中的分页Elasticsearch

时间:2019-03-12 06:37:03

标签: django elasticsearch

我是Elasticsearch的新手,我只是尝试在Django中使用它创建一个搜索引擎。总体而言,引擎显示出良好的效果。不幸的是,它加载了大量结果。然后,我尝试通过Django中的常规分页对其进行分页,然后,页面加载错误object of type 'Search' has no len()

这些是我的代码:

view.py

from django.shortcuts import render, redirect
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
from django.core.paginator import Paginator

def search_es(request):
    return render(request,'search/search.html')

def results(request):
    s = Search(using=Elasticsearch())
    keyword = request.GET.get('q') # keyword that want to be found
    print(keyword)
    if keyword:
        # posts = s.query('match_phrase_prefix',head_title=keyword)
        # if posts.count() == 0:
        posts = s.query(
            "multi_match",
            query=keyword,
            fields=['head_title^5', 'description^5', 'description.ngram'],
            # type="phrase_prefix",
        )
        posts = posts[0: 100]
    else:
        posts = ''

    page = request.GET.get('page', 1)
    paginator = Paginator(posts, 10)
    try:
        users = paginator.page(page)
    except PageNotAnInteger:
        users = paginator.page(1)
    except EmptyPage:
        users = paginator.page(paginator.num_pages)

    context = {
        'page_title': keyword,
        'posts': users,
        'count': posts.count(),
        'keyword': keyword,
    }

    return render(request,'search/results.html',context)

results.html

{% if posts.has_other_pages %}
  <ul class="pagination">
    {% if posts.has_previous %}
      <li><a href="?page={{ posts.previous_page_number }}">«</a></li>
    {% else %}
      <li class="disabled"><span>«</span></li>
    {% endif %}
    {% for i in posts.paginator.page_range %}
      {% if posts.number == i %}
        <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
      {% else %}
        <li><a href="?page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if posts.has_next %}
      <li><a href="?page={{ posts.next_page_number }}">»</a></li>
    {% else %}
      <li class="disabled"><span>»</span></li>
    {% endif %}
  </ul>
{% endif %}

希望获得所有可能的解决方案。 非常感谢。

0 个答案:

没有答案