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日

相关文章

  • python+flask编写接口实例详解

    下面我就详细讲解”Python+Flask编写接口实例详解”的完整攻略。 概述 Python是一种高效的编程语言,主要用于Web开发、数据分析、人工智能等领域。而Flask是Python的一个轻量级Web框架,可以用于构建Web应用和API。本文将会给出Python和Flask的使用实例,带你一步步从零开始构建一个简单的API。 环境搭建 首先,我们需要安装…

    Flask 2023年5月15日
    00
  • flask-SQLALchemy连接数据库的实现示例

    现在我将详细讲解“flask-SQLALchemy连接数据库的实现示例”的完整攻略,共包含两条示例说明。 示例一 简介 本示例旨在展示如何使用Flask-SQLAlchemy连接数据库。 Flask-SQLAlchemy是一种Flask扩展,可以轻松地使用SQLAlchemy进行数据库交互。 SQLAlchemy是一种SQL工具包,允许Python开发人员使…

    Flask 2023年5月16日
    00
  • Ajax与JSON的一些学习总结

    我来为你详细讲解“Ajax与JSON的一些学习总结”的攻略。 什么是Ajax? Ajax是Asynchronous JavaScript and XML的缩写,即异步的JavaScript和XML。它是一种利用JavaScript与后台进行数据交互的技术。 Ajax的原理 Ajax的核心在于XMLHttpRequest对象,通过它可以发送HTTP请求、接收H…

    Flask 2023年5月16日
    00
  • Flask Cookie 使用方法详解

    Flask 是一个 Python Web 框架,Cookie 是一个小型文本文件,由服务器发送给 Web 浏览器并保存在本地计算机上,用于跟踪用户。本文将详细介绍 Flask 中的 Cookie 处理,并提供代码示例。 Flask 的 Cookie 模块 Flask 的 Cookie 模块是 Flask 对 Python 标准库中 Cookie 模块的封装。…

    Flask 2023年3月13日
    00
  • Flask快速实现分页效果示例

    我们来详细讲解一下Flask快速实现分页效果的完整攻略。 1. 简介 分页功能是实现网站数据的快速浏览的重要组成部分。在Web开发中,分页通常需要考虑到性能、数据量和用户体验等问题。Flask是一款轻量级的Web应用框架,可以快速搭建一个简单的应用程序,本篇攻略我们将介绍如何使用Flask快速实现分页效果。 2. 第一条示例 接下来我们将介绍一个简单的分页实…

    Flask 2023年5月15日
    00
  • python中的信号通信 blinker的使用小结

    标题:Python中的信号通信 blinker的使用小结 什么是blinker? blinker 是一个简单的 Python 库,作用是用于处理事件的发布和订阅。它提供了一个 Signal 类型,用于将函数连接到一个事件源上,并在该事件源发布事件时自动触发对应的函数。 安装blinker 首先需要安装 blinker 库,在命令行中使用 pip 命令进行安装…

    Flask 2023年5月16日
    00
  • 哪种Python框架适合你?简单介绍几种主流Python框架

    哪种Python框架适合你? Python是一种高级编程语言,根据 TIOBE编程语言排行榜,Python是全球使用最广泛的第三种编程语言。Python具有简单易学和广泛的应用领域,如web开发、数据挖掘、机器学习、游戏开发等。 Python编程具有很强的灵活性,但是在开发大型应用程序或者组织复杂的代码库时会变得混乱不堪,并且难以维护。随着Python语言的…

    Flask 2023年5月15日
    00
  • Django中信号signals的简单使用方法

    下面是Django中信号signals的简单使用方法: 什么是信号signals? 信号signals是Django提供的一种机制,通过该机制,某些操作的完成可以触发指定的处理函数,我们可以在这些处理函数中实现一些自己想要的操作。比如:在用户注册成功后,我们想给他发送一封欢迎电子邮件,那么我们就可以使用信号来实现这个功能。 Django中的信号signals…

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