我如何分割Flask搜索引擎结果到不同的页面?



我使用Flask创建了一个搜索引擎,它返回来自与健康主题相关的文章生成的Wikipedia语料库的搜索结果。有些查询返回数百个结果,因此我想添加一个将结果拆分为多个页面的特性。下面是生成网页的index.html代码:

{% extends "base.html" %}
{% block title %}Search Page{% endblock %}
{% block contents %}
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="search-result-box card-box">
<div class="row">
<div class="col-md-8 offset-md-2">
<div class="pt-3 pb-4">
<div class="search-form">
<form action="#" method="POST">
<div class="input-group">
<input type="text" name="msg" class="form-control input-lg">                    
<div class="input-group-btn">
<button class="btn  btn-primary" type="submit">Search</button>
</div>
</div>
</form>
</div>
<div class="mt-4 text-center"><h4>Search Results For {{user_query}}</h4></div>
</div>
</div>
</div>
<!-- end row -->
<ul class="nav nav-tabs tabs-bordered">
<li class="nav-item"><a href="#home" data-toggle="tab" aria-expanded="true" class="nav-link active">All results <span class="badge badge-success ml-1">{{search_results_list|length}}</span></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="home">
<div class="row">
<div class="col-md-12">
<div class="search-item">
{% if search_results_list|length > 0 %}
{% for r in search_results_list %}
<div class="font-13 text-success mb-3"><a href='{{r[0]}}' target="_blank">{{r[0]}}</a></div>
<div class="font-13 text-success mb-3"><p target="_blank">{{r[1]}}</p></div>
{% endfor %}
{% else %}
<p class="mt-4 text-center">No search result</P>
{% endif %}
</div>
<ul class="pagination justify-content-end pagination-split mt-0">
<li class="page-item"><a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">«</span> <span class="sr-only">Previous</span></a></li>
<li class="page-item active"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#" aria-label="Next"><span aria-hidden="true">»</span> <span class="sr-only">Next</span></a></li>
</ul>
<div class="clearfix"></div>
</div>
</div>
</div>
<!-- end All results tab -->
</div>
</div>
</div>
</div>
<!-- end row -->
</div>
<!-- Footer -->
<footer id="main-footer" class="pt-2 py-4 bg-dark text-white text-center">
Copyright &copy;
<span class="year"></span> Team Dream
</footer>
<!-- container -->

{% endblock %}

我没有很多用HTML创建网页的经验,所以我不完全确定如何添加这个功能。下面是生成应用程序的Python代码:

from flask import Flask, render_template, request
from search_engine import query_prep, OkapiBM25
import pickle
app = Flask(__name__)
@app.route('/')
def results():
return render_template('index.html')
@app.route('/', methods=['POST'])
def process_res():
with open("inv_index.pickle", "rb") as file:
inv_ind = pickle.load(file)
user_search_query = request.form['msg']
queries = {'q': query_prep(user_search_query)}
ranking = OkapiBM25(inv_ind, queries)['q']
seen = set()
newRes= []
myDict = pickle.load(open('text_summaries.pickle','rb'))

for r in ranking:
newRes.append((r[1], myDict[r[1]]))
return render_template('index.html', search_results_list = newRes,
user_query=user_search_query)
if __name__ == "__main__":
app.run(debug=True)

代码用语料库的倒排索引打开一个pickle文件,然后对索引运行查询,对结果排序,并返回它们。在每个搜索结果的下方还会出现维基百科文章的文本摘要。这里是网页的部署版本,如果你想玩它,看看我在做什么:https://searchenginecapstone.herokuapp.com/

如果搜索"运行状况",则";您将看到在一个页面上有442个结果。我想调整代码(我认为这将只在HTML部分完成——但不完全确定),将结果分成10-20个块。在页面的右下角已经有一个用于Pages的按钮,但它目前没有做任何事情。我很感激你能提供的任何帮助或建议。如果你需要从编码方面看到其他东西来回答这个问题,请告诉我。

我看到Flask对paginate()方法的分页有原生支持,所以如果我修改render_template()中返回的内容:

from flask_paginate import Pagination, get_page_parameter
def process_res():
with open("inv_index.pickle", "rb") as file:
inv_ind = pickle.load(file)
user_search_query = request.form['msg']
queries = {'q': query_prep(user_search_query)}
ranking = OkapiBM25(inv_ind, queries)['q']
seen = set()
newRes= []
myDict = pickle.load(open('text_summaries.pickle','rb'))

for r in ranking:
newRes.append((r[1], myDict[r[1]]))
page = request.args.get(get_page_parameter(), type=int, default=1)
pagination = Pagination(page=page, total=len(newRes), search=user_search_query, record_name='Search Results')
return render_template('index.html', search_results_list = newRes,
user_query=user_search_query,
Pagination = pagination)

页面似乎工作(没有分页出现),所以我想我必须更新索引文件,以反映分页的变化,但我不知道如何。

如果您正在使用Flask-SQLAlchemy扩展,则可以使用paginate()方法将搜索引擎结果拆分为不同的页面。

最新更新