[了解基本概念
一,初识es
1.是什么?
ElasticSearch 简称es,开源的分布式的全文搜索引擎,可以近乎实时的存储检索数据,es使用java开发,并且使用Lucene作为核心实现搜索功能。
2.能干什么?
分布式的搜索引擎,全文检索,数据分析引擎(分组聚合),对海量数据实时处理
3.有什么特点?
快速搜索,分布式部署,可按照分数排序,resultful所有操作可以通过http接口进行
(1)分布式的实时文档存储,每个字段都可以被搜索和索引
(2)分布式的实时文档搜索引擎
(3)胜任上百个服务节点的拓展,支持PB以上的结构化和非结构化数据
4.使用场景?
搜索类场景,日志分析类场景(经典的ELK组合,可完成日志收集分析存储)5
5.同类搜索对比?
同类的有Lucene,solr,ElasticSearch是目前主流的全文搜索方案,但是 Lucene 只是一个工具包,它不是一个完整的全文检索引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch。
Solr 和ElasticSearch都是基于Lucene实现的,不同点如下:
1.solr利用zookpper进行分布式管理,而ElasticSearch自身携带分布式协调管理功能
2.elasticSearch实时性更好
相同点:
底层都依赖Lucene,lucene能实现全文搜索因为实现了倒排索引的查询结构
6.版本迭代?
6.1 集群连接变化
transportClient被抛弃,es7的java代码,只能使用restClient,建议使用
High-level-rest-client的方法操作es集群
6.2 存储结构变化
es7中使用默认的_doc作为type
6.3 默认配置变化
默认节点为主机名,默认分片数改为1,不再是5
6.4 Lucene升级为lucene 8 查询相关性速度优化
二,入门概念
1.索引 index
理解为关系型数据库
2.type
理解为数据库中的一张表,注意ES各个版本之前区别很大
es5中一个index可以有多个type; es6中一个index 只能有一个type;es7中逐步移除
type这个概念
3.映射 mapping
定义了每个字段的类型等信息,相当于关系型数据库的表结构
4.常用数据类型
String类型,分为两种。 text:可分词,不可参与聚合;keyWord:不可分词,数据作为完整字段匹配,可以参与聚合
数字:number,可以分为Long,integer,short,byte,double,float
数组:array
布尔:boolean
日期:可以对日期格式格式化日期存储,但是建议存储为毫秒值,存储为long,节省空间。
经纬度:geo_point,ip
对象:object,例如
{
"name":"Jack",
"age":21,
"girl":{
"name":"Rose",
"age":21
}
}
4.通过和关系型数据库的对比,能更加容易理解
5.ik分词器
有两种分词模式:ik_matx_word 和ik_smart模式
1.ik_max_word(常用)
将文本做最细粒度拆
如果对“南京市长江大桥”采用ik_max_word分词
POST _analyze
{
"analyzer": "ik_max_word",
"text": "南京市长江大桥"
}
分词结果如下:
{
"tokens": [
{
"token": "南京市",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "南京",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 1
},
{
"token": "市长",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "长江大桥",
"start_offset": 3,
"end_offset": 7,
"type": "CN_WORD",
"position": 3
},
{
"token": "长江",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 4
},
{
"token": "大桥",
"start_offset": 5,
"end_offset": 7,
"type": "CN_WORD",
"position": 5
}
]
}
2.ik_smart
会做最粗粒度拆分
如果对“南京市长江大桥”采用ik_smart分词,分词结果如下:
POST _analyze
{
"analyzer": "ik_smart",
"text": "南京市长江大桥"
}
{
"tokens": [
{
"token": "南京市",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "长江大桥",
"start_offset": 3,
"end_offset": 7,
"type": "CN_WORD",
"position": 1
}
]
}
6.倒排索引
(1)正向索引(forward index)
在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合。
例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数
和出现位置。
(2)正向索引结构
文档1的ID>单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表…
一般是通过key找到value 。
如果只存在正向索引,那就需要扫描索引库中的所有文档,找出包含关键词“华为手机”的文档,再根据打分模型进行打分,排出名次呈现给用户。
(3)反向索引 (inverted index)
所以搜索引擎会将正向索引重构为倒排索引,把文件ID对应关键词的映射转化为关键词到ID的映射,从词的关键字去找文档
(4) 我在网上找的一个比较容易理解的例子如下:
假设有一批技术书籍,编好编号如下图
如果想搜索并发相关的词,正向索引呢就会遍历表格,找到编号为1和4的两条记录。
如果采用倒排索引的话,首先会对书籍的名称进行分词,比如:Java并发编程之美,会被分词成为 java 并发 编程 , 分词之后,会存储分词和文档ID的对应关系
这时,在倒排索引中搜索并发,就能够通过分词并发找到对应的ids编号,
(4)参考链接,个人觉得讲解很好,很容易理解:ES原理之倒排索引 - 同济小孙 - 博客园