es+flask搜索小项目实现分页+高亮的示例代码

下面我将详细讲解“es+flask搜索小项目实现分页+高亮的示例代码”完整攻略,包含两条示例说明。

示例一:使用Python Flask框架和Elasticsearch检索引擎实现搜索功能

步骤一:准备工作

  1. 安装Python Flask框架以及它的依赖包。
  2. 安装Elasticsearch检索引擎驱动程序的Python客户端库:elasticsearch-py。

步骤二:构建Flask应用程序框架

from flask import Flask, request, render_template, jsonify
from elasticsearch import Elasticsearch

app = Flask(__name__)
es_host = "localhost"
es_port = "9200"
index_name = "my_index"

es = Elasticsearch([{'host': es_host, 'port': es_port}])

@app.route("/")
def home():
    return render_template("search.html")


@app.route("/search", methods=['POST'])
def search():
    keywords = request.form['keywords']

    # 搜索请求:
    search_results = es.search(index=index_name, body={
        "query": {
            "multi_match": {
                "query": keywords,
                "fields": ["title^3", "content", "author^2"]
            }
        },
        "highlight": {
            "pre_tags": ["<b>"],
            "post_tags": ["</b>"],
            "fields": {
                "title": {},
                "content": {},
                "author": {}
            }
        }
    })

    # 处理搜索结果:
    hits = search_results['hits']['hits']
    results = []
    for hit in hits:
        result = hit['_source']
        result['id'] = hit['_id']
        result['score'] = hit['_score']
        result['highlight'] = hit['highlight']
        results.append(result)

    return jsonify({"results": results})

步骤三:使用Jinja2模板引擎创建搜索页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>搜索</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <form id="search_form" action="/search" method="POST">
        <input type="text" name="keywords" placeholder="搜索关键字">
        <input type="submit" value="搜索">
    </form>
    <table>
        <thead>
        <tr>
            <th>标题</th>
            <th>作者</th>
            <th>正文</th>
            <th>关键词</th>
            <th>得分</th>
        </tr>
        </thead>
        <tbody id="search_results">
        </tbody>
    </table>
    <script>
        $("#search_form").submit(function (event) {
            event.preventDefault();      // 防止提交
            var keywords = $("input[name='keywords']").val();
            $.ajax({
                type: "POST",
                url: "/search",
                data: {"keywords": keywords},
                dataType: "json",
                success: function (response) {
                    var results = response['results'];
                    $("#search_results").html("");
                    for (var i = 0; i < results.length; i++) {
                        var result = results[i];
                        var title = result['highlight']['title'][0];
                        var content = result['highlight']['content'][0];
                        var author = result['highlight']['author'][0];
                        var keywords = result['keywords'];
                        var score = result['score'];
                        var tr = '<tr><td>' + title + '</td>' +
                            '<td>' + author + '</td>' +
                            '<td>' + content + '</td>' +
                            '<td>' + keywords + '</td>' +
                            '<td>' + score + '</td></tr>';
                        $("#search_results").append(tr);
                    }
                },
                error: function (response) {
                    console.log(response);
                }
            })
        });
    </script>
</body>
</html>

以上就是使用Python Flask框架和Elasticsearch检索引擎实现搜索功能的完整攻略。

示例二:Flask+Elasticsearch实现分页+高亮搜索

步骤一:在mapping上启用highlight属性

修改创建index的mapping,将需要高亮的fields加上highlight属性,例如:

{
    "mappings": {
        "properties": {
            "title": {"type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "fields": {"raw": {"type": "keyword"}} ,"index": True ,"highlight": {"type": "unified", "pre_tags": "<i>", "post_tags": "</i>", "number_of_fragments": 3}},
            "content": {"type": "text", "analyzer": "ik_smart", "search_analyzer": "ik_smart", "fields": {"raw": {"type": "keyword"}} ,"index": True ,"highlight": {"type": "unified", "pre_tags": "<i>", "post_tags": "</i>", "number_of_fragments": 3}}
        }
    }
}

步骤二:在查询中指定高亮部分

修改查询部分代码,使用Query DSL指定高亮部分。

from flask import Flask, request, render_template, jsonify
from elasticsearch import Elasticsearch

app = Flask(__name__)
es_host = "localhost"
es_port = "9200"
index_name = "my_index"

es = Elasticsearch([{'host': es_host, 'port': es_port}])

@app.route('/')
def index():
    return render_template('index.html')


@app.route('/search')
def search():
    keywords = request.args.get('keywords', '')
    page = int(request.args.get('page', 1))
    page_size = int(request.args.get('page_size', 10))
    start = (page - 1) * page_size

    search_body = {
        'from': start,
        'size': page_size,
        'query': {
            'multi_match': {
                'query': keywords,
                'fields': ['title', 'content']
            }
        },
        'highlight': {
            'pre_tags': ['<span style="color:red">'],
            'post_tags': ['</span>'],
            'fields': {
                'title': {},
                'content': {}
            }
        }
    }

    results = es.search(index=index_name, body=search_body)

    total = results['hits']['total']['value']
    hits = results['hits']['hits']

    search_results = []
    for hit in hits:
        result = hit['_source']
        result['_id'] = hit['_id']
        result['_score'] = hit['_score']
        if 'highlight' in hit:
            highlight = hit['highlight']
            if 'title' in highlight:
                result['title'] = ''.join(highlight['title'])
            if 'content' in highlight:
                result['content'] = ''.join(highlight['content'])
        search_results.append(result)

    total_page = (total + page_size - 1) // page_size
    previous_page = page - 1 if page > 1 else None
    next_page = page + 1 if page < total_page else None

    return jsonify({
        'total': total,
        'total_page': total_page,
        'current_page': page,
        'previous_page': previous_page,
        'next_page': next_page,
        'results': search_results
    })

步骤三:使用Jinja2模板引擎创建搜索页面

<!DOCTYPE html>
<html>
<head>
    <title>搜索</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<div id="search">
    <input type="text" name="keywords" id="keywords">
    <button id="search_btn">搜索</button>
    <div id="search_results"></div>
    <div id="page_info"></div>
    <button id="prev_btn" disabled>上一页</button>
    <button id="next_btn" disabled>下一页</button>
</div>
<script>
    var page = 1;
    var page_size = 10;

    function search() {
        var keywords = $('#keywords').val();
        $.getJSON('/search', {
            'keywords': keywords,
            'page': page,
            'page_size': page_size
        }, function (data) {
            var total = data['total'];
            var total_page = data['total_page'];
            var current_page = data['current_page'];
            var previous_page = data['previous_page'];
            var next_page = data['next_page'];
            var results = data['results'];

            var search_html = '';
            for (var i = 0; i < results.length; i++) {
                var result = results[i];
                var id = result['_id'];
                var title = result['title'];
                var content = result['content'];
                var score = result['_score'];
                search_html += '<div class="result">';
                search_html += '<h3><a href="/detail/' + id + '">' + title + '</a></h3>';
                search_html += '<div class="score">得分:' + score + '</div>';
                search_html += '<div class="content">' + content + '</div>';
                search_html += '</div>';
            }

            var page_info_html = '共' + total + '个搜索结果,当前第' + current_page + '/' + total_page + '页';
            if (previous_page) {
                $('#prev_btn').removeAttr('disabled');
            } else {
                $('#prev_btn').attr('disabled', 'disabled');
            }
            if (next_page) {
                $('#next_btn').removeAttr('disabled');
            } else {
                $('#next_btn').attr('disabled', 'disabled');
            }

            $('#search_results').html(search_html);
            $('#page_info').html(page_info_html);
        });
    }

    $('#search_btn').click(function () {
        page = 1;
        search();
    });

    $('#prev_btn').click(function () {
        page -= 1;
        search();
    });

    $('#next_btn').click(function () {
        page += 1;
        search();
    });
</script>
</body>
</html>

以上就是Flask+Elasticsearch实现分页+高亮搜索的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:es+flask搜索小项目实现分页+高亮的示例代码 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • flask使用session保存登录状态及拦截未登录请求代码

    下面是“flask使用session保存登录状态及拦截未登录请求代码”的完整攻略,包含两条示例说明。 什么是Session Session 是指用户与Web应用间的一次会话,可以用来存储在整个会话过程中需要跨越请求和响应之间一直使用的数据。 在 Flask 中,可以使用 session 对象保存用户会话数据。session 对象是一个相当有用的、用于临时存储…

    Flask 2023年5月16日
    00
  • Flask框架中的session设置详解

    Flask是一个非常流行的Python Web框架,它提供了许多功能来帮助Web开发者构建高效和可维护的Web应用程序。其中,session是Flask框架提供的一个功能强大的机制,来实现对客户端的状态跟踪。 本文将详细介绍Flask框架中session的设置和使用方法。 什么是session? Session是一种保存在服务器上的对象,用于存储跨请求的信息…

    Flask 2023年5月15日
    00
  • Golang两行代码实现发送钉钉机器人消息

    当你想要通过钉钉机器人来发送消息时,可以使用Golang来实现,且只需要两行代码即可完成。下面是实现的完整攻略: 步骤一:创建钉钉机器人 首先需要在钉钉官网上创建一个机器人,并获取其Webhook URL。具体步骤如下: 登录钉钉开放平台:https://open-dev.dingtalk.com/#/login 点击左侧导航栏中的“自定义机器人管理”。 点…

    Flask 2023年5月16日
    00
  • python中使用PIL制作并验证图片验证码

    Python中使用PIL(Python Imaging Library)制作并验证图片验证码可以用于验证用户的身份,增加系统的安全性。本文将详细讲解制作并验证图片验证码的完整攻略,包括以下内容: 安装PIL库 制作图片验证码 校验图片验证码 1. 安装PIL库 在Python中使用PIL库需要先安装PIL库。可以使用pip命令进行安装: pip instal…

    Flask 2023年5月16日
    00
  • Python 搭建Web站点之Web服务器网关接口

    下面我会详细讲解 Python 搭建 Web 站点之 Web 服务器网关接口的完整攻略,包括过程和两条示例说明。 前置知识 在学习本文之前,你需要具备以下知识: Python 的基本语法和基础知识 Web 服务器的基本原理和搭建方法 Python Web 框架的基本概念和应用 Web 服务器网关接口 WSGI 是 Web 服务器网关接口的缩写,是 Pytho…

    Flask 2023年5月15日
    00
  • python 获取sqlite3数据库的表名和表字段名的实例

    接下来我将详细讲解“python 获取sqlite3数据库的表名和表字段名的实例”的完整攻略,过程中也会包含两条示例说明。 1. 获取sqlite3数据库的表名 我们可以通过sqlite_master系统表来获取sqlite3数据库中的表名。 示例代码: import sqlite3 def get_table_names(db_file_path): co…

    Flask 2023年5月16日
    00
  • Python的Flask框架中的Jinja2模板引擎学习教程

    下面我将为您详细介绍Python的Flask框架中的Jinja2模板引擎学习教程。 什么是Jinja2模板引擎 Jinja2是Python语言中一种基于模板的高性能、健壮、可扩展的模板引擎。它利用简单的语法糖和强大的功能,使得在Web开发中使用模板变得简单、易用并且高效。 如何使用Jinja2模板引擎 安装Flask框架 Jinja2是Flask框架中默认的…

    Flask 2023年5月16日
    00
  • 在Python的Flask框架下收发电子邮件的教程

    在Python的Flask框架下收发电子邮件需要使用到Python标准库中的smtplib和email模块。 安装Flask-Mail 在开始之前,需要先安装Flask-Mail。 可以在终端中使用以下命令进行安装: pip install Flask-Mail 或者在服务器/虚拟环境中使用以下命令进行安装: sudo pip install Flask-M…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部