Comment diviser les résultats du moteur de recherche Flask en différentes pages ?
P粉614840363
P粉614840363 2024-02-03 21:29:43
0
1
421

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 &copy;
    <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.

P粉614840363
P粉614840363

répondre à tous(1)
P粉883223328

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal