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 ...
随机推荐
- 金融任务实例实时、离线跑批Apache DolphinScheduler在新网银行的三大场景与五大优化
在新网银行,每天都有大量的任务实例产生,其中实时任务占据多数.为了更好地处理任务实例,新网银行在综合考虑之后,选择使用 Apache DolphinScheduler 来完成这项挑战.如今,新网银行多 ...
- Python带我起飞——入门、进阶、商业实战_ 入门版电子书籍分享,
Python带我起飞--入门.进阶.商业实战_ 免费下载地址 内容简介 · · · · · · <Python带我起飞--入门.进阶.商业实战>针对Python 3.5 以上版本,采用&q ...
- [极客大挑战 2019]HardSQL-1
1.打开之后万能密码等均被过滤,那就先确定下过滤的内容,采用brup抓包进行爆破,发现对union进行了过滤,因此这里就没法使用联合注入,结果如下: 爆破得字典: ^ & && ...
- 解读Gartner2022年组装式应用报告:从组装式企业到组装式应用
摘要:"到2023年,采用组装式方法的组织在新特性交付速度比竞争对手快80%."Gartner 为什么未来的企业是组装式的? 物竞天择,适者生存,企业也是一样,在发展过程中,会为了 ...
- 抛砖系列之git仓库拆分工具git-filter-repo
最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...
- Java开发学习(三十)----Maven聚合和继承解析
一.聚合 分模块开发后,需要将这四个项目都安装到本地仓库,目前我们只能通过项目Maven面板的install来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较麻烦的 如果四个项 ...
- KingbaseES V8R6集群维护之--修改数据库服务端口案例
案例说明: 对于KingbaseES数据库单实例环境,只需要修改kingbase.conf文件的'port'参数即可,但是对于KingbaseES V8R6集群中涉及到多个配置文件的修改,并且在应 ...
- Sentinel源码分析-滑动窗口统计原理
滑动窗口技术是Sentinel比较关键的核心技术,主要用于数据统计 通过分析StatisticSlot来慢慢引出这个概念 @Override public void entry(Context con ...
- Git Bash(提交文件到GitHub进行托管)
Introduction 使用Git Bash命令,可以将一个项目上传到Github官网中,进行托管,避免重要文件被误删 1.Git工具下载 Git for Windows 2.在github中新 ...
- 我的Go并发之旅、01 并发哲学与并发原语
注:本文所有函数名为中文名,并不符合代码规范,仅供读者理解参考. 上下文 上下文(Context)代表了程序(也可以是进程,操作系统,机器)运行时的环境和状态,联系程序整个生命周期与资源调用,是程序可 ...