Hyperf使用ElasticSearch记录
Hyperf 安装 Elasticsearch 协程客户端
hyperf/elasticsearch 主要为 elasticsearch-php 进行了客户端对象创建的工厂类封装,elasticsearch-php 默认使用 Guzzle Ring 客户端,在 hyperf/guzzle 中我们实现了协程版本的 Handler,所以可以直接使用 Hyperf\Elasticsearch\ClientBuilderFactory 创建一个新的 Builder。
- 安装
composer require hyperf/elasticsearch
- 创建客户端
class ElasticsearchService
{
protected $container;
protected Client $es_client;
public function _initialize(): void
{
$this->container = ApplicationContext::getContainer();
$client_builder = $this->container->get(ClientBuilderFactory::class);
$builder = $client_builder->create();
$host = [
'https://账号:密码@地址:9200'
];
$this->es_client = $builder->setHosts($host)->build();
}
}
这里的账号密码指的是创建 elasticsearch 的时候的账号密码。如果是用阿里云或者腾讯云服务,创建好了之后一样会有
这里只是创建了协程客户端,里面的实际方法是要自己重新定义的
开发基本步骤
1 安装 es 服务,也可以是腾讯云或者阿里云,腾讯云阿里云也只是提供 es 服务而已,并不是能直接看到数据。数据还是要在 kibana 里面查看。
2 创建协程客户端
3 创建 index。index 相当于 mysql 里面的库
4 创建 mapping mapping 可以理解成表。要存储数据要先定义好表。
5 index 方法推送单条数据。bulk 批量推送数据
6 search 搜索数据。
备注:
以下全网最全了
https://blog.csdn.net/qq_41911898/article/details/110089644 可以在这里查看每个方法的数据格式。
https://blog.csdn.net/qq_18361349/article/details/106369551 参考
完整代码
<?php
namespace App\Service\Common;
use App\Service\Service;
use Elasticsearch\Client;
use Hyperf\Elasticsearch\ClientBuilderFactory;
use Hyperf\Utils\ApplicationContext;
/**
*
*/
class ElasticsearchService extends Service
{
/**
* @var
*/
protected $container;
/**
* @var Client
*/
protected Client $es_client;
public function _initialize(): void
{
$this->container = ApplicationContext::getContainer();
$client_builder = $this->container->get(ClientBuilderFactory::class);
$builder = $client_builder->create();
$host = [
'https://账号:密码@地址:9200'
];
$this->es_client = $builder->setHosts($host)->build();
}
/**
* 创建index - 相当于MySQL的数据库
* @param string $index
* @return array
*/
public function createIndex(string $index): array
{
$params = [
'index' => $index,
];
return $this->es_client->indices()->create($params);
}
/**
* 设置mapping
* @param $params
* @return array
*/
public function putMapping($params): array
{
return $this->es_client->indices()->putMapping($params);
}
/**
* 获取mapping
* @param $params
* @return array
*/
public function getMapping($params): array
{
return $this->es_client->indices()->getMapping($params);
}
/**
* 判断索引是否存在
* @param string $index
* @return bool
*/
public function indexExistsEs(string $index): bool
{
$params = [
'index' => $index,
];
return $this->es_client->indices()->exists($params);
}
/**
* 删除索引
* @param string $index
* @return array|callable
*/
public function deleteIndex(string $index): callable|array
{
$params = [
'index' => $index
];
return $this->es_client->indices()->delete($params);
}
/**
* 创建文档
* @param array $params
* @return array|callable
*/
public function indexEs(array $params): callable|array
{
$index_data = [
'index' => $params['index'],
'body' => $params['body'],
];
return $this->es_client->index($index_data);
}
/**
* 批量创建文档
* @param array $params
* @return callable|array
*/
public function bulk(array $params): callable|array
{
return $this->es_client->bulk($params);
}
/**
* 更新文档
* @param array $params
* $params = [
* 'index' => 'chat_data',
* 'id' => '文档id',
* 'doc' => [
* '字段名1' => '要修改的值',
* '字段名2' => '要修改的值',
* '字段名3' => '要修改的值',
* ]
* ]
* @return array|callable
*/
public function update(array $params): callable|array
{
$params = [
'index' => $params['index'],
'id' => $params['id'],
'body' => [
'doc' => $params['doc']
]
];
return $this->es_client->update($params);
}
/**
* 删除文档
* @param $params
* @return array|callable
*/
public function deleteEs($params): callable|array
{
extract($params);
$delete_data = [
'index' => $index,
'type' => $type,
'id' => $id,
];
return $this->es_client->delete($delete_data);
}
/**
* es搜索数据
* @param array $params
* @param int $page
* @param int $size
* @return array|callable
*/
public function search(array $params, int $page = 1, int $size = 15): callable|array
{
$search = $params['search'];
$params = [
'index' => $params['index'],
'from' => ($page <= 0) ? 0 : $page - 1,
'size' => $size
];
// 只有一个搜索字段时
if (count($search) == 1) {
$query = [
'match_phrase' => $search
];
} else {
$must = [];
foreach ($search as $k => $v) {
// 一定要把时间筛选弄出来,因为这里的条件类似where('xxxx','xxxx')
if(!in_array($k,['start_time','end_time'])) {
$must[] = ['match' => [$k => $v]];
}
}
$query['bool']['must'] = $must;
// 时间搜索
if(!empty($search['start_time'])) {
$filter = [
'range' => [
'start_time' =>[
'gte' => $search['start_time'],
'lte' => $search['end_time']
]
]
];
$query['bool']['filter'] = $filter;
}
}
$params['body'] = [
'query' => $query,
];
return $this->es_client->search($params);
}
}
Hyperf使用ElasticSearch记录的更多相关文章
- ASP.NET Core使用Elasticsearch记录NLog日志
ASP.NET Core使用Elasticsearch记录NLog日志 1.新建一个 ASP.NET Core项目 2.安装Nuge包 运行:Install-Package NLog.Web.AspN ...
- Elasticsearch 记录
查看集群运行状态 GET /_cat/health?v 响应 1573460861 16:27:41 my-application yellow 1 1 372 372 0 0 371 0 - 50. ...
- kubernetes实战篇之helm填坑与基本命令
系列目录 其实前面安装部分我们已经分享一些互联网上其它网友分享的一些坑,本篇介绍helm的基本使用以及在使用过程中碰到的一些坑. 客户端版本和服务端版本不一致问题 有些朋友可能在使用helm init ...
- Elasticsearch 的坑爹事——记录一次mapping field修改过程
Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapp ...
- log4net.NoSql +ElasticSearch 实现日志记录
前言: 前两天在查找如何扩展log4net的日志格式时找到一个开源项目Log4net.NoSql,它通过扩展Appender实现了把日志输出到ElasticSearch里面.顺藤摸瓜,发现涉及的项目还 ...
- 记录bigdesk中ElasticSearch的性能参数
定时采集bigdesk中的Elasticsearch性能参数,并保存到数据库或ELK,以便于进行长期监控. 基于python脚本实现,脚本如下: #coding=gbk import httplibi ...
- ElasticSearch elasticsearch-servicewrapper 在linux上的安装部署全程记录
原文地址:http://www.cnblogs.com/tianjixiaoying/p/4316011.html 由于项目需求,需要在linux平台搭建一套ES服务.在搭建过程中,遇到各种各样的问题 ...
- 记录Linux下安装elasticSearch时遇到的一些错误
记录Linux下安装elasticSearch时遇到的一些错误 http://blog.sina.com.cn/s/blog_c90ce4e001032f7w.html (2016-11-02 22: ...
- ElasticSearch 学习记录之ES几种常见的聚合操作
ES几种常见的聚合操作 普通聚合 POST /product/_search { "size": 0, "aggs": { "agg_city&quo ...
随机推荐
- Java开发学习(二十二)----Spring事务属性、事务传播行为
一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...
- 羽夏看Linux内核——引导启动(上)
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- Vuex与前端表格施展“组合拳”,实现大屏展示应用的交互增强
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 下图是一个产品开发中非常常见的大屏展示界面 ...
- PerfView专题 (第八篇):洞察 C# 内存泄漏之寻找静态变量名和GC模式
一:背景 这篇我们来聊一下 PerfView 在协助 WinDbg 分析 Dump 过程中的两个超实用技巧,可能会帮助我们快速定位最后的问题,主要有如下两块: 洞察内存泄漏中的静态大集合变量名. 验证 ...
- 微信小程序/校园社区论坛/微信云开发/云函数
一.框架来源 1.非常非常感谢B站up主"梦千的曾哥哥"的开源框架. 没有他就没有这个小程序.如果有想做的同学,可以直接移步他的视频那里开始学习.我水平不够,就不教具体怎么配置环境 ...
- CF-D. Another Problem About Dividing Numbers
Problem - D - Codeforces 题意:问能否在进行K次操作的情况下,将两个数变得相同,操作为每次选择一因子,然后除该因子. 题解:要判断该数最多能进行几次除的操作,其实就是判断这个数 ...
- JavaWeb核心篇(3)——JSP,MVC,三层架构
JavaWeb核心篇(3)--JSP,MVC,三层架构 在本篇文章中我们会学习到JSP,MVC,三层架构 虽然JSP已经快被时代所淘汰,但是在一些老旧的工作场所还是有在使用,所以了解一下也不为过 至于 ...
- VSCODE 配置远程调试环境
以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16691460.html 我的需求是,在Windows桌面 ...
- 【学习笔记】前馈神经网络(ANN)
前言 最近跟着<神经网络与深度学习>把机器学习的内容简单回顾了一遍,并进行了一定的查缺补漏,比如SVM的一些理解,one-hot向量,softmax回归等等. 然后我将继续跟着这本书,开始 ...
- kibana配置文件kibana.yml参数详解
server.port: 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号. server.host: 默认值: "localhost" 指定后端服务 ...