Saya menggunakan Flask untuk mencipta enjin carian yang mengembalikan hasil carian daripada korpus Wikipedia yang dijana daripada artikel yang berkaitan dengan topik kesihatan. Sesetengah pertanyaan mengembalikan ratusan hasil, jadi saya ingin menambah ciri untuk membahagikan hasil kepada berbilang halaman. Berikut ialah kod index.html
untuk menjana halaman 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 %}
Saya tidak mempunyai banyak pengalaman membuat halaman web dengan HTML, jadi saya tidak pasti sepenuhnya cara menambahkan fungsi ini. Berikut juga kod Python untuk menjana aplikasi:
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)
Kod ini membuka fail jeruk menggunakan indeks terbalik korpus, kemudian menjalankan pertanyaan terhadap indeks itu, menyusun keputusan dan mengembalikannya. Ringkasan teks setiap artikel Wikipedia juga ditunjukkan di bawah setiap hasil carian. Jika anda ingin mencubanya dan melihat perkara yang saya cuba lakukan, berikut ialah versi halaman yang digunakan: https://searchenginecapstone.herokuapp.com/
Jika anda mencari "kesihatan" anda akan melihat 442 hasil pada satu halaman. Saya ingin melaraskan kod (saya rasa ini akan dilakukan dalam bahagian HTML sahaja - tetapi tidak pasti sepenuhnya) untuk membahagikan keputusan kepada 10-20 ketul. Sudah terdapat butang untuk halaman di penjuru kanan sebelah bawah halaman, tetapi pada masa ini ia tidak melakukan apa-apa. Saya menghargai sebarang bantuan atau idea yang anda boleh berikan. Jika ada perkara lain yang anda perlu lihat dari perspektif pengekodan untuk menjawab soalan ini, sila beritahu saya.
Saya dapati apa yang dikembalikan 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)
Halaman itu nampaknya berfungsi (tiada penomboran muncul), jadi saya rasa saya perlu mengemas kini fail indeks untuk mencerminkan perubahan penomboran, tetapi saya tidak tahu caranya.
Jika anda menggunakan sambungan Flask-SQLAlchemy, anda boleh menggunakan kaedah paginate() untuk membahagikan hasil enjin carian kepada halaman yang berbeza.