您现在的位置是:首页 > 编程 > 

Elasticsearch搜索引擎在高性能PHP框架webman快速调用

2025-07-27 13:07:50
Elasticsearch搜索引擎在高性能PHP框架webman快速调用 简介本客户端旨在降低elasticsearch的上手难度,依赖于官方的客户端插件elasticsearch/elasticsearch。直接使用官方客户端需要手动构建复杂的请求体,稍微有一点错误,操作结果就不对。所以单独构建一个依赖官方客户端的插件,用户只需要传入关键字即可,后面增加了类似于关系型数据库的链式操作方法,用起来

Elasticsearch搜索引擎在高性能PHP框架webman快速调用

简介

本客户端旨在降低elasticsearch的上手难度,依赖于官方的客户端插件elasticsearch/elasticsearch。直接使用官方客户端需要手动构建复杂的请求体,稍微有一点错误,操作结果就不对。所以单独构建一个依赖官方客户端的插件,用户只需要传入关键字即可,后面增加了类似于关系型数据库的链式操作方法,用起来更简单一些。

当然,本插件只能满足一些常用的功能需求,较为复杂的需求仍然需要手动构建请求体,你可以使用本插件 直接调用官方客户端的方法。

开源技术小栈注意:根据elasticsearch安全策略需求,若你安装的elasticsearch8以下,请使用v1.0.9及以下版本,若你安装的elasticsearch8及以上版本,请使用v1.1.0及以上版本。

安装代码语言:javascript代码运行次数:0运行复制
composer require xiaosongshu/elasticsearch

elasticsearch服务配置

代码语言:javascript代码运行次数:0运行复制
docker run -d --name elasticsearch -p 9200:9200 -p 900:900 -e "=single-node" elasticsearch:7.17.7

docker run -d --name elasticsearch -p 9200:9200 -p 900:900 -e "=single-node" -e "xpack.=false" -e "xpack.security.http.=false" elasticsearch:8.15.0

兼容elasticsearch v8.15.5版本,高版本需要使用账号密码,账号为elastic密码为12456端口号为9201,可以根据自己的实际需求调整配置。

代码语言:javascript代码运行次数:0运行复制
docker run -d --name my-es -p 9201:9200 -p 901:900 -e "=single-node" -e "ELASTIC_PASSWORD=12456" -e "xpack.=true" elasticsearch:8.15.5

如果是多个服务之间调用,可能需要创建网络

代码语言:javascript代码运行次数:0运行复制
# 创建默认的网络桥接
docker network create default_network
# 创建网络
docker network create shared_network
# 将Elasticsearch容器加入网络(假设容器名为my-es,根据实际修改)
docker network connect shared_network my-es
# 将PHP容器加入网络(假设容器名为your_php_container_name,根据实际修改)
docker network connect shared_network your_php_container_name

关于IK分词器

参考 加入Ik分词器的方法:

基本配置

支持thinkPHP,laravel,webman等常用框架,需要创建配置文件elasticsearch.php ,放到config目录下。 配置内容如下所示:

代码语言:javascript代码运行次数:0运行复制
 return [
    /** 节点列表 */
    'nodes' => ['127.0.0.1:9200'],
    /** 用户名 */
    'username'=>'',
    /** 密码 */
    'password'=>'',
];
基本用法

实例化客户端

代码语言:javascript代码运行次数:0运行复制
$client = new \Xiaosongshu\Elasticsearch\ESClient();

使用方法

代码语言:javascript代码运行次数:0运行复制
<?php
require_once 'vendor/autoload.php';

/** 实例化客户端 elasticsearch链式操作演示 */
$client = new \Xiaosongshu\Elasticsearch\ESClient([
    /** 节点列表 */
    'nodes' => ['192.168.101.170:9200'],
    /** 用户名 */
    'username' => '',
    /** 密码 */
    'password' => '',
]);

/** 获取表结构 */
$result = $client->getMap(['index']);

/** 删除索引 */
$client->deleteIndex('index');
/** 如果不存在index索引,则创建index索引 */
if (!$client->IndexExists('index')) {
    /** 创建索引 */
    $client->createIndex('index', '_doc');
}
/** 创建表 */
$result = $client->createMappings('index', '_doc', [
    'id' => ['type' => 'long',],
    'title' => ['type' => 'text', "fielddata" => true,],
    'content' => ['type' => 'text', 'fielddata' => true],
    'create_time' => ['type' => 'text'],
    'test_a' => ["type" => "integer"],
    'test_b' => ["type" => "rank_feature", "positive_score_impact" => false],
    'test_c' => ["type" => "rank_feature"],
    'name' => ['type' => 'text', "fielddata" => true,],
    'age' => ['type' => 'integer'],
    '' => ['type' => 'integer'],
]);

/** 批量插入数据链式操作 */
$result = $client->table('index', '_doc')->insertAll([
    [
        'id' => rand(1, 99999),
        'title' => '天有不测风云',
        'content' => '月有阴晴圆缺',
        'create_time' => date('Y-m-d H:i:s'),
        'test_a' => rand(1, 10),
        'test_b' => rand(1, 10),
        'test_c' => rand(1, 10),
        'name' => '张三',
        'age' => 27,
        '' => 1
    ]
]);
/** 调用elasticsearch原生方法 */
$params = [
    'index' => 'my_index',
    'type' =>"_doc",
    'id' => "demo",
];
/** 使用原生方法统计满足某条件的数据 */
$result = $client->count($params);
/** 使用原生方法判断是否存在某一条数据 */
$result = $client->exists($params);

/** 查询数据链式操作 */
$result = $client
    /** 设置表名 */
    ->table('index','_doc')
    /** must限制条件 */
    ->where(['title','=','测试'])
    /** whereIn查询 */
    ->whereIn('age',[28])
    /** whereotIn查询 */
    ->whereotIn('age',[27,29])
    /** should限制条件 当must和should冲突的时候,must条件优先 */
    ->orWhere(['test_a','>',8])
    /** 排序 */
    ->orderBy('test_a','asc')
    /** 分页 */
    ->limit(0,10)
    /** 筛选查询字段 */
    ->select(['name','age'])
    /** 按字段分组 */
    ->groupBy(['age',''])
    /** 聚合查询 */
    ->sum(['age'])
    /** 执行查询操作 */
    ->getAll();

/** 聚合查询链式操作 */
$result = $client->table('index','_doc')->max(['age'])->getAll();
/** 获取所有数据 */
$result = $client->table('index','_doc')->getAll();

/** 根据条件更新所有数据链式操作 */
$result = $client->table('index','_doc')->where(['test_a','>',2])->updateAll(['name'=>'陈圆圆']);
/** 根据条件删除数据链式操作 */
$result = $client->table('index','_doc')->where(['test_a','>',2])->deleteAll();
/** 获取所有的index索引 */
$result = $client->getIndex(['index']);
/** 使用id更新数据 */
$result = $client->table('index','_doc')->updateById('kmXADJEBegXAJ580Qqp6',['content'=>'今天你测试了吗']);
/** 使用id 删除数据 */
$result = $client->table('index','_doc')->deleteByIds(['kmXADJEBegXAJ580Qqp6']);
/** 使用id查询数据 */
$result = $client->table('index','_doc')->findById('kmXADJEBegXAJ580Qqp6');
/** 使用id批量查询 */
$result = $client->table('index','_doc')->getByIds(['kmXADJEBegXAJ580Qqp6']);
/** 添加脚本 */
$script = <<<eof
if (('content') && doc['content'].size() != 0) {
        return doc['content.raw'].value + '_' + '谁不说按家乡好';
      } else {
        return '字段缺失'; // 或者返回其他适当的默认值
      }
eof;
$result = $client->addScript('update_content',$script);
/** 添加脚本 */
$result = $client->addScript('update_content2',"(doc['content'].value)+'_'+'abcdefg'");
/** 获取脚本内容 */
$result = $client->getScript('update_content');
/** 使用脚本查询 */
$result = $client->table('index','_doc')->withScript('update_content11')->getAll();
/** 删除脚本*/
$result = $client->deleteScript('update_content');
/** 原生查询 */
$result = $client->query([
    'index'=>'index',
    'type'=>'_doc',
    'body'=>[
        'query'=>[
            'bool'=>[
                'must'=>[
                    [
                        'match_phrase'=>[
                            'title'=>'风云'
                        ],
                    ],
                    [
                        'script'=>[
                            'script'=>"doc['content'].size() != 0"
                        ]
                    ]
                ]
            ]
        ]
    ]
]);
/** 打印处理 结果*/
print_r($result);

测试

代码语言:javascript代码运行次数:0运行复制
 php ./vendor/bin/phpunit -c phpunit.xml
本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2024-12-10,如有侵权请联系 cloudcommunity@tencent 删除框架php搜索引擎elasticsearch高性能

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1240985.html

相关标签:无
上传时间: 2025-07-27 02:26:29
留言与评论(共有 14 条评论)
本站网友 服装有限公司
20分钟前 发表
$script); /** 添加脚本 */ $result = $client->addScript('update_content2'
本站网友 中国电视剧飞天奖
5分钟前 发表
'fielddata' => true]
本站网友 界面库
4分钟前 发表
可能需要创建网络代码语言:javascript代码运行次数:0运行复制# 创建默认的网络桥接 docker network create default_network # 创建网络 docker network create shared_network # 将Elasticsearch容器加入网络(假设容器名为my-es
本站网友 牛皮癣偏方
13分钟前 发表
900 -e "=single-node" -e "xpack.=false" -e "xpack.security.http.=false" elasticsearch
本站网友 河南省南阳工业学校
13分钟前 发表
laravel
本站网友 身高体重计算公式
13分钟前 发表
9200']
本站网友 成人如何提高记忆力
29分钟前 发表
900 -e "=single-node" -e "ELASTIC_PASSWORD=12456" -e "xpack.=true" elasticsearch
本站网友 兴宁市第一中学
7分钟前 发表
'test_c' => ["type" => "rank_feature"]
本站网友 胎儿b超
0秒前 发表
用户只需要传入关键字即可
本站网友 吕玉兰
4分钟前 发表
must条件优先 */ ->orWhere(['test_a'
本站网友 大连开发区房价
16分钟前 发表
9200']
本站网友 建筑模型论坛
22分钟前 发表
'_doc')->getByIds(['kmXADJEBegXAJ580Qqp6']); /** 添加脚本 */ $script = <<<eof if (('content') && doc['content'].size() != 0) { return doc['content.raw'].value + '_' + '谁不说按家乡好'; } else { return '字段缺失'; // 或者返回其他适当的默认值 } eof; $result = $client->addScript('update_content'
本站网友 鼠标输入法
4分钟前 发表
29]) /** should限制条件 当must和should冲突的时候