es笔记和php操作es-爱代码爱编程
es是什么?
分布式全文搜索引擎
解决什么问题?
传统关系型数据库全文索引慢
原理?
分布式架构
倒排索引:倒排索引是一个将单词映射到它们在文档中出现的位置的数据结构
word 文档ID1,文档ID2
区别于正排索引:
文档ID1 word
文档ID2 word
分词器(分词策略):分词器是将文本分割成单个单词的组件,standard分词器 —— ES默认分词器,对于中文会按每个字分开处理,会忽略特殊字符
一般中文用IK中文分词器即可,按词语来分词
设置哪些可以分词
可以自定义分词规则,例如按空格分
支持自定义词典
分析器:
大小写,敏感or不好的词转*
查询:“小米”会被拆成“小”和“米”来进行查询,用match_all才会用“小米”
场景?
大量数据的全文搜索
劣势or坑?
硬件要求高:Elasticsearch 在处理大量数据时需要大量的内存和处理能力
可能会脑裂
概念对比
es mysql
群集 Database
索引 表
字段 字段
文档 行
Elastic search 6.X 一个索引类型只能包含一个type
Elastic search 7.X 去掉了索引类型type
如果要搜索操作日志:
1、建立索引。建立opt_log索引,定好哪些字段是分词,哪些是需要检索
2、新建文档。把日志新增到es里
3、查询
9300 端口为 Elasticsearch 集群间组件的通信端口 tcp port
9200 端口为浏览器访问的 http协议 RESTful 端口。 http port
put、get、delete是幂等的
post是非幂等的
PUT用于更新操作,POST用于新增操作比较合适
POST /uri 创建
DELETE /uri/xxx 删除
PUT /uri/xxx 更新或创建
GET /uri/xxx 查看
POST 新增。如果不指定id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号;
PUT 可以新增也可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改;
创建索引:PUT school
索引不能使用大写字母
索引不能重复
添加数据:POST school/_doc/10
修改数据:POST school/_doc/10
删除数据:POST school/_doc/10
查询数据:POST school/_doc/10
主从
索引分片:索引是可以切分存放的
shard(分片)和 replica(副本)
集群:
与其他节点通信配置:discovery.seed_hosts:["localhost":9001,"localhost":9002]
一般id自己指定比较好,因为删除和更新需要,如:用户名
单节点集群:分片,3主3从
集群:3个单节点集群组合起来,redis和es都是如此
插件:Elasticsearch-head插件,可以看集群状态
配置
分片和他的副本不能放一起,不然挂了全没了
启动:逐个启动
扩容:集群加节点,启动后会对分片进项重新分配
故障转移:挂了一个,会重新分配
路由计算:哈希取模,计算得到节点(得到协调节点?)
分片控制:有个协调节点,如果是3个节点,每个节点3个分片的es集群,其实每个节点保存的数据是一样的,这里跟redis有区别
写流程:
先到协调节点
到指定节点
然后同步到副本
读流程:
先到协调节点
轮训定位查哪个节点(负载均衡)
php如何连接es集群:
可以使用PHP官方提供的Elasticsearch PHP客户端库,跟redis集群一样,配置多个ip就行
es如何保证最新的索引被搜索到?
按段搜索。通过新的补充索引来反映最新的修改情况,而不是重新整个倒排索引。查询的时候进行数据合并
如何保证实时搜索?
kibana:es数据进行可视化展示
Logstash:常用于日志系统中做日志采集设备,最常用于ELK中作为日志收集器使用
hive 是一个构建在Hadoop上的数据仓库工具,hive建一个外部表映射,写sql 操作es
// 创建索引
在 Postman 中,向 ES 服务器发 PUT 请求 : http://127.0.0.1:9200/shopping
// 查询索引,http://127.0.0.1:9200/_cat/indices?v,类似mysql的show tables
// 查询单个索引, http://127.0.0.1:9200/shopping
// 创建文档,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc,请求体JSON内容为:{"tile":"哈哈哈"...}
// 主键查询,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/_doc/1 。
// 全部修改,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc/1
// 删除,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping/_doc/1
// 条件查询, http://127.0.0.1:9200/shopping/_search
// URL带参查询, http://127.0.0.1:9200/shopping/_search?q=category:小米
// 请求体带参查询, http://127.0.0.1:9200/shopping/_search,请求体为json
{
"query":{
"match":{
"category":"小米"
}
}
}
// php代码
<?php
require 'vendor/autoload.php'; // 引入 Elasticsearch-PHP 库
$client = Elasticsearch\ClientBuilder::create() // 创建 Elasticsearch 客户端
->setHosts(['localhost:9200']) // 设置 Elasticsearch 节点的地址和端口
->build();
$params = [
'index' => 'my_index', // 指定要检索的索引名称
'type' => 'my_type', // 指定要检索的文档类型名称
'body' => [ // 设置检索条件
'query' => [
'match' => [
'title' => 'php' // 检索标题中包含“php”的文档
]
]
]
];
$response = $client->search($params); // 发送搜索请求
print_r($response); // 输出搜索结果