当前位置: 首页 > news >正文

thinkphp中使用Elasticsearch 7.0进行多表的搜索

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、thinkphp中使用Elasticsearch 7.0进行多表的搜索
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

提示:thinkphp中使用Elasticsearch 7.0进行多表的搜索:

thinkphp数据库配置文件

 // Elasticsearch数据库配置信息'elasticsearch' => ['scheme' =>'http','host' => '127.0.0.1','port' => '9200','user' => '','pass' => '','timeout' => 2,],

提示:以下是本篇文章正文内容,下面案例可供参考

一、thinkphp中使用Elasticsearch 7.0进行多表的搜索

示例:thinkphp中使用Elasticsearch 7.0进行多表的搜索

二、使用步骤

1.引入库

直接上代码如下(示例):

composer require "elasticsearch/elasticsearch": "7.0.*"

2.读入数据

代码如下(示例):


namespace app\common\model;
use think\facade\Db;
use think\Model;
use Elasticsearch\ClientBuilder;
class Article extends Model
{protected $client;public function __construct($data = []){parent::__construct($data);try {	$this->client = ClientBuilder::create()->setHosts([config('database.connections.elasticsearch.host') . ':' . config('database.connections.elasticsearch.port')])->build();} catch (\Exception $e) {// 输出连接错误信息echo $e->getMessage();exit;}}// 添加文档到Elasticsearchpublic function addDocument(){$articles = Db::name('article')->select();foreach ($articles as $article) {$data = ['id' => $article['id'], // 文章表的 ID'title' => $article['title'],'content' => $article['content'],'category_id' => $article['category_id'], // 文章表的 ID];$params = ['index' => 'articles', // 索引名称'id' => $data['id'], // 文章 ID 作为文档的唯一标识'body' => $data,];$response = $this->client->index($params);}return $response;}// 搜索文档public function searchDocuments($index,$query){$params = ['index' => $index,'body' => ['query' => ['multi_match' => ['query' => $query,'fields' => ['title', 'content'],],],],];$response = $this->client->search($params);return $response;}
}
<?php
/*** Created by PhpStorm.* User: wangkxin@foxmail.com* Date: 2023/9/2* Time: 17:55*/namespace app\common\model;
use think\facade\Db;
use think\Model;
use Elasticsearch\ClientBuilder;class Book extends Model
{protected $client;public function __construct($data = []){parent::__construct($data);try {// $host = config('database.connections.elasticsearch.host');// $port = config('database.connections.elasticsearch.port');$this->client = ClientBuilder::create()->setHosts([config('database.connections.elasticsearch.host') . ':' . config('database.connections.elasticsearch.port')])->build();} catch (\Exception $e) {// 输出连接错误信息echo $e->getMessage();exit;}}// 添加文档到Elasticsearchpublic function addDocument(){$books = Db::name('book')->select();foreach ($books as $book) {$data = ['id' => $book['id'], // 书籍表的 ID'user_id' => $book['user_id'], // 书籍表作者ID'book' => $book['book'],];$params = ['index' => 'books', // 索引名称'id' => $data['id'], // 文章 ID 作为文档的唯一标识'body' => $data,];$response = $this->client->index($params);}return $response;}// 搜索文档public function searchDocuments($index,$query){$params = ['index' => $index,'body' => ['query' => ['multi_match' => ['query' => $query,'fields' => ['book'],],],],];$response = $this->client->search($params);return $response;}
}
<?php
/*** Created by PhpStorm.* User: wangkxin@foxmail.com* Date: 2023/9/2* Time: 15:27* 全局搜素模型*/namespace app\common\model;use think\Model;
use Elasticsearch\ClientBuilder;class ElasticsearchModel extends Model
{protected $client;public function __construct($data = []){parent::__construct($data);try {$this->client = ClientBuilder::create()->setHosts([config('database.connections.elasticsearch.host') . ':' . config('database.connections.elasticsearch.port')])->build();} catch (\Exception $e) {// 输出连接错误信息echo $e->getMessage();exit;}}public function globalSearch($keyword){// 搜索articles索引$articles = $this->searchIndex('articles', $keyword);// 搜索books索引$books = $this->searchIndex('books', $keyword);// 合并搜索结果$result = array_merge($articles, $books);return $result;}protected function searchIndex($index, $keyword){$params = ['index' => $index,'body' => ['query' => ['multi_match' => ['query' => $keyword,'fields' => ['title', 'content','book'],],],],];// 执行搜索请求$response = $this->client->search($params);// 解析结果$result = [];if (isset($response['hits']['hits'])) {foreach ($response['hits']['hits'] as $hit) {$result[] = $hit['_source'];$result['index'] = $index;}}return $result;}}
<?php
/*** Created by PhpStorm.* User: wangkxin@foxmail.com* Date: 2023/9/2* Time: 18:53*/namespace app\index\controller;use app\common\model\ElasticsearchModel;class SearchController
{//全局搜索个表间的数据public function search($keyword){$searchModel = new ElasticsearchModel();$result = $searchModel->globalSearch($keyword);return json($result);}
}
namespace app\index\controller;
use app\BaseController;
use app\common\model\Article as ElasticArticle;
use app\common\model\Book as ElasticBook;
use app\Request;
use Elasticsearch\ClientBuilder;class Demo1 extends BaseController
{
//新增索引,建议在模型中新增 ,删除, 修改 或者使用观察者模式更新ES索引public function addDocument(){$elasticsearchArticle = new ElasticArticle();$response = $elasticsearchArticle->addDocument();$elasticsearchBook = new ElasticBook();$response1 = $elasticsearchBook->addDocument();return json($response);// print_r(json($response));// print_r(json($response1));}/*** 单独搜索文章表例子*/public function search(Request $request){$keyword = $request->param('keyword');$elasticsearchModel = new ElasticArticle();$index = 'articles';$query = '你';$response = $elasticsearchModel->searchDocuments($index, $query);return json($response);}//单独搜搜书籍表public function searchBook(Request $request){$keyword = $request->param('keyword');$elasticsearchModel = new ElasticBook();$index = 'books';$query = '巴黎';$response = $elasticsearchModel->searchDocuments($index, $query);return json($response);}public function deleteIndex(){$client = ClientBuilder::create()->build();$params = ['index' => 'my_index', // 索引名称];$response = $client->indices()->delete($params);if ($response['acknowledged']) {return '索引删除成功';} else {return '索引删除失败';}}}

使用的表

CREATE TABLE `article` (`id` int(11) NOT NULL AUTO_INCREMENT,`category_id` int(11) DEFAULT NULL,`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,`content` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;CREATE TABLE `book` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) DEFAULT NULL,`book` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;CREATE TABLE `elasticsearch_model` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`model_name` varchar(255) NOT NULL DEFAULT '' COMMENT '模型名称',`index_name` varchar(255) NOT NULL DEFAULT '' COMMENT '索引名称',`created_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',`updated_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `index_name_unique` (`index_name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='Elasticsearch 模型配置表';

结果
在这里插入图片描述
在这里插入图片描述

windwos 上记住 安装 Elasticsearch 7.0 库, 和 kibana-7.0.0-windows-x86_64 图像管理工具
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

提示:这是简单例子, 注意’fields’ => [‘title’, ‘content’], 尝试使用搜索number型字段,索引报错, 貌似只支持txt类型字段搜索
例如:以上就是今天要讲的内容,本文仅仅简单介绍了Elasticsearch的使用

相关文章:

thinkphp中使用Elasticsearch 7.0进行多表的搜索

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、thinkphp中使用Elasticsearch 7.0进行多表的搜索二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;thinkphp中使用Elasticsearch 7.0进行多表的…...

说说 TCP的粘包、拆包

分析&回答 拆包和粘包是在socket编程中经常出现的情况&#xff0c; 在socket通讯过程中&#xff0c;如果通讯的一端一次性连续发送多条数据包&#xff0c;tcp协议会将多个数据包打包成一个tcp报文发送出去&#xff0c;这就是所谓的粘包。如果通讯的一端发送的数据包超过一…...

PowerToys安装

PowerToys 是微软开发者开发的免费实用工具集&#xff0c;可以用于高级用户调整和简化 Windows 操作&#xff0c;以提高效率。 官网安装方法&#xff1a; https://learn.microsoft.com/zh-cn/windows/powertoys/install 目前安装文件路径&#xff1a; https://github.com/m…...

Unity——LitJSON的安装

一、LitJSON介绍 特点 LitJSON是一个轻量级的C# JSON库&#xff0c;用于在Unity游戏开发中进行JSON数据的序列化和反序列化操作。它提供了简单而高效的接口&#xff0c;帮助开发者处理JSON数据。 以下是LitJSON库的一些主要特点和功能&#xff1a; 1. 高性能&#xff1a;Lit…...

YOLOv5:对yolov5n模型进一步剪枝压缩

YOLOv5&#xff1a;对yolov5n模型进一步剪枝压缩 前言前提条件相关介绍具体步骤修改yolov5n.yaml配置文件单通道数据&#xff08;黑白图片&#xff09;修改models/yolo.py文件修改train.py文件 剪枝后模型大小 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;…...

大数据(八):Pandas的基础应用详解(五)

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对…...

【算法】归并排序 详解

归并排序 详解 归并排序代码实现1. 递归版本2. 非递归版本 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相…...

linux 进程隔离Namespace 学习

一、linux namespace 介绍 1.1、概念 Linux Namespace是Linux内核提供的一种机制&#xff0c;它用于隔离不同进程的资源视图&#xff0c;使得每个进程都拥有独立的资源空间&#xff0c;从而实现进程之间的隔离和资源管理。 Linux Namespace的设计目标是为了解决多个进程之间…...

【MySQL】事务 详解

事务 详解 一. 为什么使用事务二. 事务的概念三. 使用四. 事务的特性原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; 五. 事务并发所带来的问题脏读问题…...

爬虫到底难在哪里?

目录 爬虫到底难在哪里 怎么学习爬虫 注意事项 爬虫工具 总结 学习Python爬虫的难易程度因人而异&#xff0c;对于具备编程基础的人来说&#xff0c;学习Python爬虫并不困难。Python语言本身比较简单易学&#xff0c;适合初学者使用。 爬虫到底难在哪里 爬虫的难点主要包…...

linux常用命令行整理

1、linux的以及目录 bin 二进制可执行文件sbin 二进制可执行文件(root用户权限)etc 系统管理和配置文件,例如常见host文件home 用户文件的根目录usr 用户存放系统应用程序(共享系统资源)opt 可选的应用程序proc 虚拟文件系统root 超级用户dev 存放设备文件mnt 系统管理员安装临…...

python字符串相关

python字符串相关 一、reverse() 函数 只能反转 列表二、reversed() 反转元组字符串等等 返回迭代器三、join和reversed反转字符串四、join串联字符串&#xff08;join连接对象仅限字符串、储存字符串的元组、列表、字典&#xff09;数字对象可通过str()转化为字符串⭐对象为字…...

JavaScript学习笔记01

JavaScript笔记01 什么是 JavaScript JavaScript 是一门世界上最流行的脚本语言&#xff0c;它是一种弱类型的脚本语言&#xff0c;其代码不需要经过编译&#xff0c;而是由浏览器解释运行&#xff0c;用于控制网页的行为。 发展历史 参考&#xff1a;JavaScript的起源故事…...

golang 通用的 grpc http 基础开发框架

go-moda golang 通用的 grpc http 基础开发框架仓库地址: https://github.com/webws/go-moda仓库一直在更新,欢迎大家吐槽和指点 特性 transport: 集成 http&#xff08;echo、gin&#xff09;和 grpc。tracing: openTelemetry 实现微务链路追踪pprof: 分析性能config: 通用…...

FSK解调技术的FPGA实现

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 一、FSK信号的解调原理 FSK信号的解调也有非相干和相干两种&#xff0c;FSK信号可以看作是用两个频率源交替传输得到的&#xff0c;所以FSK的接收机由…...

Matlab图像处理-高斯低通滤波器

高通滤波 图像的边缘、细节主要位于高频部分&#xff0c;而图像的模糊是由于高频成分比较弱产生的。高通滤波就是为了高消除模糊&#xff0c;突出边缘。因此采用高通滤波器让高频成分通过&#xff0c;消除低频噪声成分削弱&#xff0c;再经傅里叶逆变换得到边缘锐化的图像。 …...

文件上传之图片马混淆绕过与条件竞争

一、图片马混淆绕过 1.上传gif imagecreatefromxxxx函数把图片内容打散&#xff0c;&#xff0c;但是不会影响图片正常显示 $is_upload false; $msg null; if (isset($_POST[submit])){// 获得上传文件的基本信息&#xff0c;文件名&#xff0c;类型&#xff0c;大小&…...

代码随想录二刷day16

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣104. 二叉树的最大深度二、力扣559. N 叉树的最大深度三、力扣111. 二叉树的最小深度三、力扣力扣222. 完全二叉树的节点个数 前言 一、力扣104. 二叉树…...

【开发】安防监控/视频存储/视频汇聚平台EasyCVR优化播放体验的小tips

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;…...

力扣(LeetCode)算法_C++—— 只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff1…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...