J'ai utilisé Flask pour créer un moteur de recherche qui renvoie les résultats de recherche du corpus Wikipédia générés à partir d'articles liés à des sujets de santé. Certaines requêtes renvoient des centaines de résultats, je souhaite donc ajouter une fonctionnalité permettant de diviser les résultats en plusieurs pages. Voici le index.html
code pour générer une page Web :
{% 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 © <span class="year"></span> Team Dream </footer> <!-- container --> {% endblock %}
Je n'ai pas beaucoup d'expérience dans la création de pages Web avec HTML, je ne sais donc pas vraiment comment ajouter cette fonctionnalité. Voici également le code Python pour générer l'application :
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)
Ce code ouvre un fichier pickle en utilisant l'index inversé du corpus, puis exécute une requête sur cet index, classe les résultats et les renvoie. Un résumé textuel de chaque article Wikipédia est également affiché sous chaque résultat de recherche. Si vous voulez l'essayer et voir ce que j'essaie de faire, voici la version déployée de la page : https://searchenginecapstone.herokuapp.com/
Si vous recherchez « santé », vous verrez 442 résultats sur une seule page. J'aimerais ajuster le code (je pense que cela sera fait uniquement dans la partie HTML - mais pas entièrement sûr) pour diviser les résultats en 10 à 20 morceaux. Il existe déjà un bouton pour la page dans le coin inférieur droit de la page, mais il ne fait rien pour le moment. J'apprécie toute aide ou idée que vous pouvez fournir. Si vous avez besoin de voir autre chose du point de vue du codage pour répondre à cette question, faites-le-moi savoir.
J'ai découvert dans quoi Flask est revenu 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)
La page semble fonctionner (aucune pagination n'apparaît), donc je suppose que je dois mettre à jour le fichier d'index pour refléter les changements de pagination, mais je ne sais pas comment.
Si vous utilisez l'extension Flask-SQLAlchemy, vous pouvez utiliser la méthode paginate() pour diviser les résultats du moteur de recherche en différentes pages.