ElasticSearch 学习笔记
孙玉超
2021-04-13 13:44:15
0 评论
775 浏览
0 收藏
0 赞
关于 ElasticSearch
ElasticSearch (ES)是一个基于 Apache Lucene 的分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。相对于 MySQL 来说,ES 侧重于数据的检索,可用于电商系统商品搜索、地理数据分析、日志分析处理等。例如要对电商系统商品进行多维度搜索,通过 MySQL 来实现是极其复杂的。
ES 中有几个重要的概念:索引、类型、文档。
● 索引:相当于 MySQL 中的数据库层面
● 类型:相当于 MySQL 中的数据库的一张表
● 文档:相当于 MySQL 中的表里的一行数据
倒排索引
初次接触 ES 的同学很容易被这个名词所误导。其在英文中的描述为 Inverted index 。大概是因为 Inverted 有颠倒的意思,就翻译成了倒排索引。其实将其翻译为索引转换也许更合适。
在传统关系型数据库中,例如 MySQL,一般是通过索引去查询数据(文档)。而在 ES 中,存储时会将文档进行分词,然后将所有包含该分词的文档 id 放在一起。例如对于 “SpringCloud组件之 OpenFeign 基础”这句话,IK 分词之后,分词与索引 id 的对应关系为:
分词 | 包含分词的文档 id |
springcloud | 1,2,3,4,5 |
组件 | 1,2,3 |
之 | 2,5 |
openfeign | 3,4,5,6 |
基础 | 5,6,7,8 |
在 ES 中,这句话是类似上述表格的形式存储,当我们去搜索的时候,ES 也会对我们搜索文本进行分词,找到对应的分词所包含于的文档 id 集合返回。例如我们搜索 “springcloud”,会返回 1-5 五条数据。相对于 MySQL 通过索引查找数据,ES 这种通过预先分词,然后相当于用文档去查询索引的方式被称为倒排索引。
简而言之,如果面试的时候问你倒排索引,可以简单地回答为:倒排索引是通过文档去查询索引。
ES 基础命令 cat
● GET _cat/nodes: 查看所有节点信息
● GET _cat/health: 查看 ES 健康状况
● GET _cat/master: 查看主节点信息
● GET _cat/indices: 查看所有索引
保存文档
● PUT index/type/id {}
PUT blog/article/1 { "title":"title", "content":"content" }
● POST index/type[/id] {}
POST blog/article/1 #带上id,并且之前有数据则会进行更新 { "title":"title", "content":"content" } POST blog/article #不带 id,会新增一条数据,ES 自动生成字符串 id { "title":"title", "content":"content" }
ID 查询文档
● GET index/type/id
更新文档
● POST index/type/id/_update
POST blog/article/1/_update 会检查如果内容变更才会更新 { "doc": { "title": "title", "content": "content" } }
● POST/PUT index/type/id
POST blog/article/1 不会检查内容,直接更新 { "title": "title", "content": "content" } PUT blog/article/1 不会检查内容,直接更新 { "title": "title", "content": "content" }
删除文档
● DELETE index/type/id
● DELETE index
批量导入文档
● POST index/type/_bulk {}
POST blog/article/_bulk {"index":{"_id":"1"}} {"title": "title","content":"content"} {"index":{"_id":"2"}} {"title": "title","content":"content"} //空行
注意在postman中测试批量导入会提示 JSON格式不对,这个本来就不是JSON,不管它就行了,最后一行要空出来一行,不然 ES 会报错。
进阶查询
● GET blog/_search?q=*&sort=age:asc 查询所有并且按age倒序
● GET blog/_search {}
GET blog/_search { "query": { "match_all": {} }, "sort": [ { "age": "desc" } ], "from": 1, "size": 1, //分页 "_source": [ "age", "name" ] //指定字段查询 }
match 查询
match 为指定字段查询,如果字段类型是文本会进行分词,包含分词后内容的文档都能搜索到
GET blog/_search { "query": { "match": {"title":"Java"} } }
match_phrase 查询
match_phrase 短语匹配,指定字段,不会对字段值进行分词
GET blog/_search { "query": { "match_phrase": {"title":"ElasticSearch 学习笔记"} } }
multi_match 查询
multi_match 多字段匹配 ,如果字段类型是文本会进行分词
GET blog/_search { "query": { "multi_match": { "query": "springcloud", "fields": ["title", "content"] } } }
bool 复合查询
bool 为复合查询,可以包括以下几种
● must :必须满足条件
● must_not :必须不满足条件
● shuold:应该满足条件(可以满足可以不满足)
GET blog._search { "query": { "bool": { "must": [ { "match": { "title": "Java" } }, { "match": { "content": "Java" } } ], "must_not": [ { "match": { "title": "C" } }, { "match": { "content": "C++" } } ], "should": [ { "match": { "classifyId": "13" } } ] } } }
filter 查询
filter 和 must 或 must_not 有相似功能, 不同的是,filter 不会影响相关性得分 score。上面没有提到 score 的查询都会影响 score,这个叫做相关性的分。如果没有指定排序规则,那么 score 越大的文档越靠前。
使用 filter 查询,结果里面 score 字段都是 0.0 。
GET blog/_search { "query": { "bool": { "filter": [ { "range": { "browser": { "gte": 500, "lte": 600 } } }, { "match": { "content": "Java" } } ] } } }
term 查询
term 查询和 match 类似,但是 term 适合查询精确字段,例如数值类型的字段。match 会对内容分词进行全文检索,适合查询文本类型。
aggregations 聚合
待完善