目录
〝 古人学问遗无力,少壮功夫老始成 〞
如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。
一、安装
通过composer安装
composer require \'elasticsearch/elasticsearch\'
二、使用
创建ES类
<?php
require \'vendor/autoload.php\';
//如果未设置密码
$es = \\Elasticsearch\\ClientBuilder::create()->setHosts([\'xxx.xxx.xxx.xxx\'])->build();
//如果es设置了密码
$es = \\Elasticsearch\\ClientBuilder::create()->setHosts([\'http://username:password@xxx.xxx.xxx.xxx:9200\'])->build()
三、新建ES数据库
index 对应关系型数据(以下简称MySQL)里面的数据库,而不是对应MySQL里面的索引
<?php
$params = [
\'index\' => \'autofelix_db\', #index的名字不能是大写和下划线开头
\'body\' => [
\'settings\' => [
\'number_of_shards\' => 5,
\'number_of_replicas\' => 0
]
]
];
$es->indices()->create($params);
四、创建表
- 在MySQL里面,光有了数据库还不行,还需要建立表,ES也是一样的
- ES中的type对应MySQL里面的表
- ES6以前,一个index有多个type,就像MySQL中一个数据库有多个表一样
- 但是ES6以后,每个index只允许一个type
- 在定义字段的时候,可以看出每个字段可以定义单独的类型
- 在first_name中还自定义了 分词器 ik,这是个插件,是需要单独安装的
<?php
$params = [
\'index\' => \'autofelix_db\',
\'type\' => \'autofelix_table\',
\'body\' => [
\'mytype\' => [
\'_source\' => [
\'enabled\' => true
],
\'properties\' => [
\'id\' => [
\'type\' => \'integer\'
],
\'first_name\' => [
\'type\' => \'text\',
\'analyzer\' => \'ik_max_word\'
],
\'last_name\' => [
\'type\' => \'text\',
\'analyzer\' => \'ik_max_word\'
],
\'age\' => [
\'type\' => \'integer\'
]
]
]
]
];
$es->indices()->putMapping($params);
五、插入数据
- 现在数据库和表都有了,可以往里面插入数据了
- 在ES里面的数据叫文档
- 可以多插入一些数据,等会可以模拟搜索功能
<?php
$params = [
\'index\' => \'autofelix_db\',
\'type\' => \'autofelix_table\',
//\'id\' => 1, #可以手动指定id,也可以不指定随机生成
\'body\' => [
\'first_name\' => \'飞\',
\'last_name\' => \'兔\',
\'age\' => 26
]
];
$es->index($params);
六、 查询所有数据
<?php
$data = $es->search();
var_dump($data);
七、查询单条数据
- 如果你在插入数据的时候指定了id,就可以查询的时候加上id
- 如果你在插入的时候未指定id,系统将会自动生成id,你可以通过查询所有数据后查看其id
<?php
$params = [
\'index\' => \'autofelix_db\',
\'type\' => \'autofelix_table\',
\'id\' => //你插入数据时候的id
];
$data = $es->get($params);
八、搜索
ES精髓的地方就在于搜索
<?php
$params = [
\'index\' => \'autofelix_db\',
\'type\' => \'autofelix_table\',
\'body\' => [
\'query\' => [
\'constant_score\' => [ //非评分模式执行
\'filter\' => [ //过滤器,不会计算相关度,速度快
\'term\' => [ //精确查找,不支持多个条件
\'first_name\' => \'飞\'
]
]
]
]
]
];
$data = $es->search($params);
var_dump($data);
九、测试代码
基于Laravel环境,包含删除数据库,删除文档等操作
<?php
use Elasticsearch\\ClientBuilder;
use Faker\\Generator as Faker;
/**
* ES 的 php 实测代码
*/
class EsDemo
{
private $EsClient = null;
private $faker = null;
/**
* 为了简化测试,本测试默认只操作一个Index,一个Type
*/
private $index = \'autofelix_db\';
private $type = \'autofelix_table\';
public function __construct(Faker $faker)
{
/**
* 实例化 ES 客户端
*/
$this->EsClient = ClientBuilder::create()->setHosts([\'xxx.xxx.xxx.xxx\'])->build();
/**
* 这是一个数据生成库
*/
$this->faker = $faker;
}
/**
* 批量生成文档
* @param $num
*/
public function generateDoc($num = 100) {
foreach (range(1,$num) as $item) {
$this->putDoc([
\'first_name\' => $this->faker->name,
\'last_name\' => $this->faker->name,
\'age\' => $this->faker->numberBetween(20,80)
]);
}
}
/**
* 删除一个文档
* @param $id
* @return array
*/
public function delDoc($id) {
$params = [
\'index\' => $this->index,
\'type\' => $this->type,
\'id\' =>$id
];
return $this->EsClient->delete($params);
}
/**
* 搜索文档,query是查询条件
* @param array $query
* @param int $from
* @param int $size
* @return array
*/
public function search($query = [], $from = 0, $size = 5) {
// $query = [
// \'query\' => [
// \'bool\' => [
// \'must\' => [
// \'match\' => [
// \'first_name\' => \'Cronin\',
// ]
// ],
// \'filter\' => [
// \'range\' => [
// \'age\' => [\'gt\' => 76]
// ]
// ]
// ]
//
// ]
// ];
$params = [
\'index\' => $this->index,
// \'index\' => \'m*\', #index 和 type 是可以模糊匹配的,甚至这两个参数都是可选的
\'type\' => $this->type,
\'_source\' => [\'first_name\',\'age\'], // 请求指定的字段
\'body\' => array_merge([
\'from\' => $from,
\'size\' => $size
],$query)
];
return $this->EsClient->search($params);
}
/**
* 一次获取多个文档
* @param $ids
* @return array
*/
public function getDocs($ids) {
$params = [
\'index\' => $this->index,
\'type\' => $this->type,
\'body\' => [\'ids\' => $ids]
];
return $this->EsClient->mget($params);
}
/**
* 获取单个文档
* @param $id
* @return array
*/
public function getDoc($id) {
$params = [
\'index\' => $this->index,
\'type\' => $this->type,
\'id\' =>$id
];
return $this->EsClient->get($params);
}
/**
* 更新一个文档
* @param $id
* @return array
*/
public function updateDoc($id) {
$params = [
\'index\' => $this->index,
\'type\' => $this->type,
\'id\' =>$id,
\'body\' => [
\'doc\' => [
\'first_name\' => \'张\',
\'last_name\' => \'三\',
\'age\' => 99
]
]
];
return $this->EsClient->update($params);
}
/**
* 添加一个文档到 Index 的Type中
* @param array $body
* @return void
*/
public function putDoc($body = []) {
$params = [
\'index\' => $this->index,
\'type\' => $this->type,
// \'id\' => 1, #可以手动指定id,也可以不指定随机生成
\'body\' => $body
];
$this->EsClient->index($params);
}
/**
* 删除所有的 Index
*/
public function delAllIndex() {
$indexList = $this->esStatus()[\'indices\'];
foreach ($indexList as $item => $index) {
$this->delIndex();
}
}
/**
* 获取 ES 的状态信息,包括index 列表
* @return array
*/
public function esStatus() {
return $this->EsClient->indices()->stats();
}
/**
* 创建一个索引 Index (非关系型数据库里面那个索引,而是关系型数据里面的数据库的意思)
* @return void
*/
public function createIndex() {
$this->delIndex();
$params = [
\'index\' => $this->index,
\'body\' => [
\'settings\' => [
\'number_of_shards\' => 2,
\'number_of_replicas\' => 0
]
]
];
$this->EsClient->indices()->create($params);
}
/**
* 检查Index 是否存在
* @return bool
*/
public function checkIndexExists() {
$params = [
\'index\' => $this->index
];
return $this->EsClient->indices()->exists($params);
}
/**
* 删除一个Index
* @return void
*/
public function delIndex() {
$params = [
\'index\' => $this->index
];
if ($this->checkIndexExists()) {
$this->EsClient->indices()->delete($params);
}
}
/**
* 获取Index的文档模板信息
* @return array
*/
public function getMapping() {
$params = [
\'index\' => $this->index
];
return $this->EsClient->indices()->getMapping($params);
}
/**
* 创建文档模板
* @return void
*/
public function createMapping() {
$this->createIndex();
$params = [
\'index\' => $this->index,
\'type\' => $this->type,
\'body\' => [
$this->type => [
\'_source\' => [
\'enabled\' => true
],
\'properties\' => [
\'id\' => [
\'type\' => \'integer\'
],
\'first_name\' => [
\'type\' => \'text\',
\'analyzer\' => \'ik_max_word\'
],
\'last_name\' => [
\'type\' => \'text\',
\'analyzer\' => \'ik_max_word\'
],
\'age\' => [
\'type\' => \'integer\'
]
]
]
]
];
$this->EsClient->indices()->putMapping($params);
$this->generateDoc();
}
}
:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!
猪小侠源码-最新源码下载平台 PHP教程 php操作ElasticSearch搜索引擎流程详解 https://www.20zxx.cn/464263/xuexijiaocheng/qes.html
猪小侠源码,优质资源分享网
相关文章
- java非法字符‘\\ufeff‘解决方法 2024-03-11
- Java中单体应用锁的局限性&分布式锁 2024-03-11
- 如何通过php函数解决页面渲染慢的问题? 2024-03-11
- 如何评估php性能优化函数的效果? 2024-03-11
- 如何利用PHP脚本在Linux中进行目录操作 2024-03-11
- 如何通过PHP脚本在Linux中进行系统监测 2024-03-11
- 如何使用php函数来优化表单处理和提交功能? 2024-03-11
- 如何通过PHP脚本在Linux服务器上实现数据加密 2024-03-11
- 如何通过php函数来优化验证码生成和校验? 2024-03-11
- 如何使用php函数来优化多语言支持功能? 2024-03-11
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。