Elasticsearch在thinkphp5中的使用增删改查(模糊查询、批量查询)

2023-11-09

Elasticsearch在thinkphp5中的使用(模糊查询)

需要安装elasticsearch、elastic-header-master、kibana、analysis-ik四个包,如下图所示:(需要的包直接去github上搜索就可以,至于安装教程可以在csdn上搜,看好是按照在win还是linux上的,最主要的是按照会遇到很多问题,有钱首次安装会生成一个账号、密码、和code,记得保存在电脑上,首次启用kibaba时需要输入才可运行,记得安装好jdk>=1.8的版本,前提条件,所有安装的包都要对应相同的版本,否则在plugings中的ik重启就会失败)

在这里插入图片描述
注意:千万别去官网下载最新的,因为最新的那个下载后没有对应的ik中文,配置的话,我以后再写。也可以看别人的,我下载的是7.17.2的包,大于8的可能或多或少的出现问题。只针对于thinkphp5的Elasticsearch的增删改查。
在这里插入图片描述

一、创建索引

public function index()
    {
        $es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
        $params = [
            'index' => 'movies',//类似于库名
            'body' => [
                'settings' => [
                    'number_of_shards' => 3,
                    'number_of_replicas' => 2
                ],
                'mappings' => [
                    '_source' => [
                        'enabled' => true
                    ],
                    'properties' => [
                        'title' => [
                            'type' => 'text',
                            "analyzer" => "ik_max_word",
                            "search_analyzer" => "ik_max_word"
                        ]
                    ]
                ]
            ]
        ];
        //执行创建
        $r = $es->indices()->create($params);
        dump($r);
    }

二、索引中新增数据

public function add_movies_data()
    {
        $data = Movies::select();//查询数据
        $res = (new Collection($data))->toArray();
        $es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
        foreach ($res as $k=>$v){
            $params = [
                'index' =>'movies',//索引
                'type'  =>'_doc',//表(额外需要注意的,这里是固定的写法)
                'id'    =>  $v['id'],//主键
                'body'     =>$v//数据
            ];
 
            $r = $es->index($params);
        }
        echo 'success';
 
    }

三、实现在Elasticsearch中数据的搜索(使得搜索的关键字高亮)

public function search_movies()
    {
        $word = input('word');//接收关键字
        $page = input('page',1);//接收当前页(如果没接收到,默认是1)
        $size = 5;//每页显示条数
        $limit = ($page-1)*$size;//偏移量
        $client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();//创建es实例
        //设置查询的条件
        $params = [
            'index' => 'movies',//索引(类似于库)
            //'type' => '_doc',
            'body' => [
                //查询内容
                'query' => [
                    'match' => [//匹配
                        'title' => $word//匹配字段
                    ]
                ],
                'highlight' => [//高亮
                    'pre_tags' => ["<em style='color: red'>"],//样式自己写
                    'post_tags' => ["</em>"],
                    'fields' => [
                        "title" => new \stdClass()
                    ]
                ]
            ]
        ];
        //分页限制
        $params["size"] = $size;//每页显示条数
        $params["from"] = $limit;//偏移量
        $results = $client->search($params);//es搜索
        foreach ($results['hits']['hits'] as $k=>$v){
            $results['hits']['hits'][$k]['_source']['title'] = $v['highlight']['title'][0];
        }
 
        $data = array_column($results['hits']['hits'],'_source');
 
        $arr['data'] = $data;//数据
        $arr['page'] = $page;//当前页
        $arr['total'] = $results['hits']['total']['value'];//总条数
        $arr['last_page'] = ceil($results['hits']['total']['value']/$size);//总页数
 
        print_r($arr);//剩下的就是前端展示的事情了
        
    }

前端页面展示:
在这里插入图片描述

elasticsearch索引展示:
在这里插入图片描述
我将代码复制到此处:
Controller中的代码:

 public function first()
    {
        $es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
        $params = [
            'index' => 'movies01',//类似于库名
            'body' => [
                'settings' => [
                    'number_of_shards' => 3,
                    'number_of_replicas' => 2
                ],
                'mappings' => [
                    '_source' => [
                        'enabled' => true
                    ],
                    'properties' => [
                        'title' => [
                            'type' => 'text',
                            "analyzer" => "ik_max_word",
                            "search_analyzer" => "ik_max_word"
                        ],
                        'goods_name' => [//goods_name 文档名称 相当于mysql中的字段
                            'type' => 'text',//text文本
                            'analyzer' => 'ik_max_word',//analyzer 指定分词器为ik
                            'search_analyzer'=>'ik_max_word',//指定搜索时的分词器
                        ],
                        'goods_logo' => [
                            'type' => 'text'
                        ],
                        'goods_price' => [
                            'type' => 'text',//text文本
                        ],
                        'goods_desc' => [
                            'type' => 'text',//text文本
                            'analyzer' => 'ik_max_word',//analyzer 指定分词器为ik
                            'search_analyzer'=>'ik_max_word'//指定搜索时的分词器
                        ],
                        'goods_remark' => [
                            'type' => 'text',//text文本
                            'analyzer' => 'ik_max_word',//analyzer 指定分词器为ik
                            'search_analyzer'=>'ik_max_word'//指定搜索时的分词器
                        ],
                        "news_source"=>[
                            "type"=>"text",
                            "fielddata"=>true]
                    ]
                ]
            ]
        ];
        //执行创建
        $r = $es->indices()->create($params);
        dump($r);
    }


    public function add_movies_data()
    {
        $data = Goods::select();//查询数据
        $res = (new Collection($data))->toArray();
        $es = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
        foreach ($res as $k=>$v){
            $params = [
                'index' =>'movies01',//索引
                'type'  =>'_doc',//表(额外需要注意的,这里是固定的写法)
                'id'    =>  $v['id'],//主键
                'body'     =>$v//数据
            ];
            $r = $es->index($params);
        }
        echo 'success';

    }
    public function search_movies($word)
    {
        header("Access-Control-Allow-Origin:*");

        header("Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE");

        header("Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding");

//        $word = input('word');//接收关键字
        $page = input('page',1);//接收当前页(如果没接收到,默认是1)
        $size = 5;//每页显示条数
        $limit = ($page-1)*$size;//偏移量
        $client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();//创建es实例
        //设置查询的条件
        $params = [
            'index' => 'movies01',//索引(类似于库)
            //'type' => '_doc',
            'body' => [
                //查询内容
                'query' => [
                    'match' => [//匹配
                        'title' => $word//匹配字段
                    ]
                ],
                'highlight' => [//高亮
                    'pre_tags' => ["<em style='color: red'>"],//样式自己写
                    'post_tags' => ["</em>"],
                    'fields' => [
                        "title" => new \stdClass()
                    ]
                ]
            ]
        ];
        //分页限制
        $params["size"] = $size;//每页显示条数
        $params["from"] = $limit;//偏移量
        $results = $client->search($params)->asArray();//es搜索
        foreach ($results['hits']['hits'] as $k=>$v){
            $results['hits']['hits'][$k]['_source']['title'] = $v['highlight']['title'][0];
        }

        $data = array_column($results['hits']['hits'],'_source');
        $arr['data'] = $data;//数据
        $arr['page'] = $page;//当前页
        $arr['total'] = $results['hits']['total']['value'];//总条数
        $arr['last_page'] = ceil($results['hits']['total']['value']/$size);//总页数
//        print_r($arr);//剩下的就是前端展示的事情了
        return json($arr);
//        return view('index/index',compact('arr',$arr));
    }

数据库数据展示:

在这里插入图片描述
前端代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <title>xx信息查询</title>
    <script src="https://code.jquery.com/jquery-3.1.1.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
<form>
    <table id="table-search" width="80%" align="center" border="1">
        <tr>
            <td>输入关键字</td>
            <td><input type="text" maxlength="50" name="word" id="word"></td>
        </tr>
            <td>
                <input type="button" value="搜索" id="btSearch" class="ui right floated positive button btn-search"/>
            </td>
        </tr>
    </table>
</form>
<br/>
<table id="table-result" width="80%" align="center" border="1">
    <tr>
        <th>货物名称</th>
        <th>货物图标</th>
        <th>货物价格</th>
        <th>货物备注</th>
        <th>分类</th>
    </tr>
    <tbody id="tbody-result">
    </tbody>
</table>
</body>

<script>
    $(function () {
        $('#btSearch').click(function () {
            var word = $('#word').val();
            var tbody = window.document.getElementById("tbody-result");
            $.ajax({
                type: "post",
                dataType: "json",
                url: "http://www.el.com/index.php/index/index/search_movies?word="+word,
                success: function (msg) {
                    console.log(msg);
                    if (msg) {
                        var str = "";
                        var data = msg.data;
                        for (i in data) {
                            str += "<tr>" +
                                "<td align='center'>" + data[i].goods_name + "</td>" +
                                "<td align='center'>" + data[i].goods_logo + "</td>" +
                                "<td align='center'>" + data[i].goods_price + "</td>" +
                                "<td align='center'>" + data[i].goods_remark + "</td>" +
                                "<td align='center'>" + data[i].title + "</td>" +
                                "</tr>";
                        }
                        document.getElementById('tbody-result').innerHTML = str;
                    }
                },
                error: function () {
                    alert("查询失败")
                }
            });
        });
    });
</script>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch在thinkphp5中的使用增删改查(模糊查询、批量查询) 的相关文章

  • File_get_contents($url): 无法打开流

    我有一个脚本 我使用以下方法读取文件 file get contents urlencode url 我收到此错误 failed to open stream HTTP request failed HTTP 1 0 400 Bad req
  • 如何在代码输出中显示 PHP 错误?

    当通过浏览器执行PHP页面时 我们只会得到输出 但不会得到代码中的错误 如何查看后端代码发生的错误 我在代码中使用以下内容进行错误报告 error reporting E ALL E ALL ini set display errors 1
  • 如何使用 Zend 2 http 发送 json 数据?

    我已经为此苦苦挣扎了几天 我需要将一组以 json 编码的数据发送到 api 我正在尝试使用 Zend 2 http 来实现这一点 但到目前为止我还没有运气 以下是 api 手册的内容 Bulk Create Contacts This c
  • Ajax 刷新后的事件监听器

    我的网站上有一个结帐部分 我在数量部分运行此事件侦听器 以便每次根据单击的产品更新数量时 整个 div 都会使用 AJAX 重新加载 因此所有价格 总金额也会刷新 该代码可以工作一次 但之后该功能就不再工作了 cart product qu
  • phpstorm 和 xdebug 之间的连接

    我配置了 phpstorm xdebug 并且能够使用断点调试我的代码 这些天我更新了 php 通过brew 和 xdebug 现在我有 php 5 5 26 和 xdebug 2 3 3 当我尝试调试测试 和代码 时 phpstorm 告
  • PHP 中“或”的奇怪用法

    PHP s or是一个奇怪的关键字 这是一个让我感到困惑的代码片段 echo 0 or 1 prints 1 foo 0 or 1 echo foo prints 1 foo 0 or 1 echo foo prints 0 for som
  • PHP 资产管道/框架

    背景 我正在致力于 现代化 一个现有的 PHP 驱动的网站 该网站最初是一个带有一些 php 方法的静态网站 它现在有一个移动网络应用程序 多个模型和大量动态内容 然而 随着时间的推移 应用程序本身的结构与它主要是静态站点时相比并没有太大变
  • Symfony2 - 多种形式的主题

    有没有办法在同一页面上的两个 或多个 表单使用不同的主题 我有 2 个表单 我想对第一个表单使用主题 X 对第二个表单使用主题 Y 您需要在显示表单之前声明您的主题 你应该试试 form theme form ThemeX html twi
  • 查找所有具有相同值的数组键

    当值未知时 是否有一种更简单的方法来获取具有相同值的所有数组键 The problem with array unique是它返回唯一的数组 因此它找不到唯一的值 例如 从这个数组 Array a gt 1000 b gt 1 c gt 1
  • 使 Web 表单输入在各种情况下安全的正确方法是什么?

    你们都认为什么是正确的 阅读 最灵活 松散耦合 最健壮等 方法来使来自 Web 的用户输入安全地用于 Web 应用程序的各个部分 显然 我们可以为每个上下文 数据库 屏幕显示 保存在磁盘上等 使用各自的清理功能 但是是否有一些通用的 模式
  • 解决错误 413 请求实体太大

    我正在从事的项目允许我们的员工将大文件上传到我们的共享主机并获取下载链接 问题是我们的托管拒绝更改共享托管的 LimitRequestBody 还有其他解决方案可以解决 LimitRequestBody 或任何其他方法来完成这项工作吗 有两
  • 如何复制具有 MySQL 中保留的键和其他结构特征的表?

    如何复制保留键和其他结构特征的表 包括主键 外键和索引 这可以通过单个 MySQL 查询来完成吗 我正在使用 create table newtable as select 但此方法会使所有键和索引丢失 无法使用单个查询来从另一个表复制一个
  • 如何在 Yii 框架中从数据库中获取所有表名和列名

    我正在开发一个模块 我想在其中执行动态相关下拉表和列名称功能 前任 获取所有表名称并将其显示在下拉字段中 选择特定表后 我想在下拉字段中再次显示其所有列名称 问题是 1 如何从数据库中获取所有表名 2 如何从表中获取所有列名 我尝试了一些文
  • PHP 中的舍入

    a 0 1 0 7 10 int 0 1 0 7 10 PHP 返回 false 有人能给我解释一下 为什么会发生这种情况吗 第一个返回 8 第二个返回 7 引用PHP 浮点精度手册中的大红色警告 http de3 php net manu
  • PHP字符串比较和相似度索引

    在 PHP 中 有什么优雅的代码可以在两个字符串中查找公共字母而不包含空格 还返回相似性索引 即计算常见字符的数量并返回占字符总数的百分比 假设我有一个字符串 LEGENDARY 而其他字符串为 BARNEY STINSON 所以我需要找到
  • 基于 ajax 的弹出窗口中的 Mathjax + CKEditor 4 + CKEditor

    我已经配置了 CKEditor 4 并且我的页面上有以下内容 我的页面中有一个 CKEditor 设置值的两个选项 这两个选项本身分别选项两个基于 ajax 的弹出窗口 这些基于 ajax 的弹出窗口包含 CKEditor 现在我有以下问题
  • JSON 编码和大引号

    我在 PHP 5 的本机实现中遇到了一个有趣的行为json encode 显然 当将对象序列化为 json 字符串时 编码器将清空包含 卷曲 引号的字符串的任何属性 这种类型可能会在启用自动转换的情况下从 MS Word 文档中复制粘贴 这
  • 如何使用 symfony 对管理面板中自己的列进行排序?

    M schema yml News columns title type string 50 category id type integer 4 relations Category local category id foreign c
  • 字符串不等于其自身

    But why if i echo good else echo bad echos gt gt bad 您应该复制此片段 如果你手写的话 它会起作用 它让我疯狂 你太狡猾了 第二个 I 不是小写拉丁文小写 i 我把它转储了 hexdump
  • Codeigniter,为MySQL创建表和用户

    我想以编程方式使用 CI 创建数据库和用户 到目前为止 我有这 2 个简单的 MySQL 语句 CREATE DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8 general c

随机推荐