suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie teile ich die Ergebnisse der Flask-Suchmaschine auf verschiedene Seiten auf?

Ich habe Flask verwendet, um eine Suchmaschine zu erstellen, die Suchergebnisse aus dem Wikipedia-Korpus zurückgibt, die aus Artikeln zu Gesundheitsthemen generiert wurden. Einige Abfragen geben Hunderte von Ergebnissen zurück, daher möchte ich eine Funktion hinzufügen, um die Ergebnisse auf mehrere Seiten aufzuteilen. Das Folgende ist der index.html-Code zum Generieren einer Webseite:

{% 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 %}

Ich habe nicht viel Erfahrung mit der Erstellung von Webseiten mit HTML und bin mir daher nicht ganz sicher, wie ich diese Funktionalität hinzufügen soll. Hier ist auch der Python-Code zum Generieren der Anwendung:

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)

Dieser Code öffnet eine Pickle-Datei unter Verwendung des invertierten Index des Korpus, führt dann eine Abfrage für diesen Index aus, ordnet die Ergebnisse und gibt sie zurück. Unter jedem Suchergebnis wird außerdem eine Textzusammenfassung jedes Wikipedia-Artikels angezeigt. Wenn Sie es ausprobieren und sehen möchten, was ich versuche, finden Sie hier die bereitgestellte Version der Seite: https://searchenginecapstone.herokuapp.com/

Wenn Sie nach „Gesundheit“ suchen, werden auf einer Seite 442 Ergebnisse angezeigt. Ich würde gerne den Code anpassen (ich denke, dass dies nur im HTML-Teil geschehen wird – bin mir aber nicht ganz sicher), um die Ergebnisse in 10–20 Teile aufzuteilen. In der unteren rechten Ecke der Seite befindet sich bereits eine Schaltfläche für die Seite, die derzeit jedoch keine Funktion hat. Ich freue mich über jede Hilfe oder Idee, die Sie uns geben können. Wenn Sie zur Beantwortung dieser Frage noch etwas aus der Codierungsperspektive benötigen, lassen Sie es mich bitte wissen.

Ich habe herausgefunden, was Flask zurückgegeben hat 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)

Die Seite scheint zu funktionieren (es wird keine Paginierung angezeigt), also muss ich wohl die Indexdatei aktualisieren, um die Paginierungsänderungen widerzuspiegeln, aber ich weiß nicht wie.

P粉614840363P粉614840363296 Tage vor391

Antworte allen(1)Ich werde antworten

  • P粉883223328

    P粉8832233282024-02-04 11:45:31

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

    Antwort
    0
  • StornierenAntwort