1.0 ElasticSearch
海量数据的
传输: flume kafka
储存:MySQL hdfs hbase ElasticSearch
计算:mr hive spark
工具:Azkaban
1.1 什么是搜索?
log
百度!=搜索
- 搜索,就是在任何场景下,找寻你想要的信息.
1.2 如果用数据库做搜索会怎么样?
- 没有办法实现输错的时候搜索–> %生化机%
1.3 什么是全文检索和Lucene?
-
全文检索:直接拿搜索的内容去比对
-
Lucene:切词–>倒排索引(支持分词)
-
Lucene就是一个jar包,帮助我们进行倒排索引 (只能做英文的分词)
1.3.1 B+ Tree
-
基于二分查找法
-
对索引建立索引:建立的是B+Tree的索引
1.3.2 Lucene倒排索引结构
重点
- Term Index是缓存到内存的,提高检索的速率
1.4 什么是ElasticSearch
-
ES是一个实时分布式搜索和分析引擎(简单的).它用于全文搜索 结构化搜索,分析.
-
考虑到分词查询就要需要用ES
1.5 ElasticSearch的适用场景
各大网站搜索
1.6 ElasticSearch的特点
- 天然分片(避免热点问题),天然集群(有副本)
- ES不是新技术
- 使用简单
- ES是对MySQL搜索功能补充
前面的都是了解一下
接下来的是重点
1.7 ElasticSearch的核心概念(重点)
-
近实时
-
Cluster(集群)
-
Node(节点)
-
Index(索引-数据库)
- 相当于MySQL的database–>分类
-
Type(类型-表)
- 相当于database的table
- 但是6.0以及之后的版本,只能有一个type,一般用_doc代替了
- 7.0以后就没有了,但是市面上一般用到6版本
-
**Document(文档-行) **
-
用json数据结构表表示
-
MySQL底层用csv来存储
-
-
Field(字段-列)
- 两者没有严格的包含和被包含
-
Mapping(映射-约束)
- 用来规定document的字段等
-
ES与数据库的类比
-
ES存入数据和和搜索数据机制
- 特别注意一下Docid
2.0 ElasticSearch快速入门
略
3.0 ElasticSearch使用(重点)
3.1 数据类型
- 核心数据类型
- 字符串类型:text(分词) keyword(不可以分词)
- 数值型:long integer short byte double float
- 日期类型:date
- 布尔类型:Boolean
- 复杂数据类型
- 只认java的数组array list
- 地理位置数据类型
- 专用类型
3.2 Mapping
# 查看所有节点信息
#手动创建Mapping
PUT stu
{
"mappiing":{
"_doc":{
"properties":{
"id":{
"type":"keyword"
},
"name":{
"type":"text"
},
"sex":{
"type":"integer"
},
"birth":{
"type":"date"
}
}
}
}
}
#插入数据
PUT stu/_doc/1001
{
"id":"001",
"name":"张丽芳",
"sex":0,
"birth":"1995-01-01"
}
#查询数据
GET stu/_search
#自动创建mapping,直接向不存在的index中插入数据即可
PUT stu1/_doc/1001
{
"id":"002",
"name":"lisi",
"sex":"male",
"birth":"2020-02-02"
}
#查看mapping信息 (在6.0版本可以直接使用)
GET stu1/_mapping
#查看keyword类型分词结果(不支持分词)
GET _analyze
{
"keyword":"我是程序员"
}
#查看text类型分词结果
GET _analyze
{
"text":"我是程序员"
}
3.3 IK分词器
- 两个分词算法:ik_smart和ik_max_word:ik_smart为最少切分;ik_max_word为最细粒度(用的较多)
3.4 检索文档
重要
- 全值匹配:把搜索的关键字当做整体来去索引比较–>和底层怎么切分没有关系,只会把整体拿去匹配
- 分词匹配:会把搜索条件进行切分
- 模糊匹配:模糊搜索
- 聚合检索:可以写多个组,组也可以嵌套
- 分页检索:分页显示,“from”:(page_num-1)* size, “size”:每页的大小
3.5 索引别名
- 不停机切换索引
3.6 索引模板
- 只要满足模板索引名称的就可以使用模板,不需要每天创建,还可以创建别名.
至少一次加上幂等性 来保证精准一次性
3.7 API操作
kafka消费的步骤