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

yizhihongxing

下面我将详细讲解“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日

相关文章

  • 公众号接入chatGPT的详细教程 附Python源码

    公众号接入chatGPT的详细教程,下面我会讲解相关步骤。 准备工作 在开始整个接入chatGPT的流程之前,需要准备以下的相关工作: 注册微信公众号并获取appid和appsecret,并在后台配置好服务器地址。 获取chatGPT的API Key。 接入流程 1. 获取用户openid 首先需要获取用户的openid,用于在后面请求chatGPT时进行身…

    Flask 2023年5月15日
    00
  • flask + pymysql操作Mysql数据库的实例

    下面是使用 Flask 和 PyMySQL 操作 MySQL 数据库的完整攻略,包含两条示例说明。 安装 PyMySQL 使用 PyMySQL 操作 MySQL 数据库需要先安装 PyMySQL 库,可以通过以下命令在命令行中安装: pip install pymysql 创建 Flask 应用 首先,需要创建一个 Flask 应用。可以通过以下代码创建一个…

    Flask 2023年5月16日
    00
  • Flask框架之数据交互的实现

    Flask是一款轻巧灵活的Python Web框架,通过Flask框架搭建后端服务可以快速地进行前后端的数据交互。本文将详细讲解Flask框架中数据交互的实现完整攻略,包括使用Flask框架通过GET和POST方式实现前后端数据传递的两个具体示例。 一、GET方式实现数据交互 GET方式是HTTP请求中最常见的一种方式,我们一般通过在URL中进行上传数据来实…

    Flask 2023年5月15日
    00
  • Python中import导入上一级目录模块及循环import问题的解决

    导入上一级目录模块在Python中十分常见,可以通过修改Python路径或使用相对路径解决。而循环import问题则需要注意模块之间的依赖关系,防止出现无限循环导致程序崩溃问题。本文将详细讲解这两个问题的解决方案,其中包含两个示例代码。 导入上一级目录模块 在Python中,导入上一级目录模块,可以通过修改系统路径添加或使用相对路径来解决。 修改系统路径添加…

    Flask 2023年5月16日
    00
  • Flask如何获取用户的ip,查询用户的登录次数,并且封ip

    下面我会分步骤详细讲解Flask如何获取用户的IP地址,查询用户的登录次数,并封锁IP的完整攻略,包含两条示例说明。 获取用户IP地址 Flask可以使用request对象获取用户的IP地址。具体步骤如下: 引入request模块:在Flask应用程序中,需要使用request模块来获取用户请求的相关信息。 python from flask import …

    Flask 2023年5月16日
    00
  • flask框架jinja2模板与模板继承实例分析

    下面是关于“flask框架jinja2模板与模板继承实例分析”的详细攻略。 1. 什么是jinja2模板? Jinja2是一个现代的、健壮的模板引擎,非常适用于Python Web应用程序。它使用简单,模板代码易于维护,并且可以灵活地支持大多数Web应用程序框架。 2. 什么是模板继承? 模板继承是Jinja2模板引擎的一个重要特性,可以帮助我们减少代码重复…

    Flask 2023年5月16日
    00
  • Django开发RESTful API实现增删改查(入门级)

    下面我详细介绍一下“Django开发RESTful API实现增删改查(入门级)”的完整攻略及两个示例: 一、开发环境准备 1. 安装 Python 和 Django 首先,需要安装 Python 和 Django。Python 是一门编程语言,而 Django 是 Python 的一个 Web 框架。我们使用 Django 来开发 Web 应用程序。可以通…

    Flask 2023年5月16日
    00
  • flask路由分模块管理及自定义restful响应格式详解

    让我来详细讲解一下 “flask路由分模块管理及自定义restful响应格式详解”。 分模块管理路由 对于复杂的 Flask 应用程序,通常需要将路由根据其功能进行分类和组织。这便是 Flask 蓝图的用处。蓝图可以让我们更好的组织视图函数及其关联的路由。 以下是 Flask 蓝图的使用方式: 导入 Blueprint 类 pythonfrom flask …

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