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 ...
随机推荐
- 如何在本地配置lemonlime和使用lemonlime测试交互题
如何在本地配置\(lemonlime\)和使用\(lemonlime\)测试交互题 \(lemonlime\)下载地址链接,提取码ae3z 点开\(lemonlime.exe\)然后编译器选择\(gc ...
- 关于 java 的动态绑定机制
关于 java 的动态绑定机制 聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解. 网上大多一言概括: 当调用对象的时候,该方法会和该对象的内存地址/运行类型绑定. 当调用对象的属性 ...
- 学习与尝试 --> 事件风暴
事件风暴 1. 基础概念 术语 执行者 -----> 是指执行的角色,系统的主体,是导致系统状态变化的触发源 人员,系统的用户,操作人员等 系统,系统本身执行的,或者调度的,自动触发的 ,第三方 ...
- Apache Pulsar Summit Asia 2020 正式启动,演讲议题征集中!
Apache Pulsar Summit 是 Apache Pulsar 社区年度盛会,它将分布在世界各地的 Apache Pulsar 项目 Contributor.Commiter 和各企业 CT ...
- Luogu3870 [TJOI2009]开关 (分块)
线段树做法很简单,但分块好啊 #include <iostream> #include <cstdio> #include <cstring> #include & ...
- Luogu3803 【模板】多项式乘法(FFT)
为什么我这么弱 其实FFT也挺水的,一点数学基础加上细心即可.细节·技巧挺多. 递归 在TLE的边缘苦苦挣扎 #include <iostream> #include <cstdio ...
- java-分支重载以及构造方法
1:方法的签名: 方法名+参数列表就是一个方法的签名 2.方法的重载(Overload): 1)发生在同一个类中,方法名称相同,参数列表不同 2)编译器在编译时会根据方法的签名自动绑定方法 3.构造方 ...
- 如何给 Flutter 有状态组件(StatefulWidget)传参?
定义好一个有状态(或无状态)的组件之后,需要为其传递一些参数,希望组件能够更加灵活使用.那么,在 Flutter 中如何为其传递参数呢? 以下是 StatefulWidget 传递值的步骤,一共三步: ...
- Spring(一)- 初始 + DI+scope
1.获取bean实例的三种方式 1.1 id 属性 1.1.1 jar <properties> <project.build.sourceEncoding>UTF-8< ...
- 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。
有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...