1. 节点
概念:节点是一个服务器,属于某个集群数据,参与集群的索引和搜索功能。与集群一样,节点也是通过名称来标识的。默认情况下,启动时会分配给节点一个UUID(全局唯一的标识符)作为名称。如果需要,可以节点取名,通常取名时应考虑功能方便识别和管理。默认情况下,节点加入名为elaticsearch的集群,通过设置节点的集群名,可加入指定集群。
2. 索引
索引是具有某种特征的文档集合,相当于一本书的目录,如果,可以为客户数据建立索引,为订单数据建立另一个索引。索引由名称标识,可以使用改名称,对索引中的文档进行建立索引、搜索、更新和删除等操作。一个集群中,索引数量不受限制。
类似于rdbms的database,对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中。在7.之后被淘汰
3. 类型(Type)
类似于rdbms的table,但是与其说像table,其实更像面向对象中的class,同一Json的格式的数据集合。
4. 文档(Document)
文档是可以建立索引的基本信息单元,相当于书的具体章节。
列如:可以为单个客户创建一个文档,为单个订单创建另外一个文档。文档用JSON(JavaScript对象表示法)表示。在索引中,理论上可以存储任意数量的文档。
类似于rdbms的row、面向对象里的object
5. 字段|属性(Field)
相当于字段,属性
6. 分片与副本(Shards & Replicas)
索引可能存储大量数据,数据量可能超过单个节点的硬件限制。
切割方式有:
a.水平切割:允许水平切割内容,以便内容可以存储到普通的服务器中
b. 允许跨分片操作(如查询时,查询多个分片),提高性能/吞吐量
7. ES概念与MySQL关系对比
MYSQL | ES5.X | ES6.X | ES7.X |
---|---|---|---|
Database | index | ||
Table | Type | Index(成了摆设) | Index(被移除掉) |
Row | Document | Document | |
Column | Field | Field |
3.ElasticSearch RestFulAPI(DSL)
1. 全局操作
-
查看集群的健康情况
GET /_cat/health?v
status的值含义
-
green(绿) 一切正常(集群功能齐全)
-
yellow(黄) 所有数据可用,但是有些副本尚未分配(集群功能完全)
-
red(红) 有些数据不可用(集群部分功能)
-
-
查看节点情况
-
GET /_cat/nodes?v
2. 对索引的操作
-
查询各个索引的状态
GET /_cat/indices?v
-
创建索引
PUT /moviee_index #PUT /索引名
-
删除索引
DELETE /moviee_index
返回true表示删除成功
-
查看某一个索引的分片情况
GET /_cat/shards/moviee_index
3. 对文档的操作
-
创建文档
格式:PUT/索引名/类型名/文档id
PUT /moviee_index/movie/1 { "id":100, "name":"operation red sea", "doubanScore":8.5, "actorList":[ {"id":1,"name":"zhang yi"}, {"id":2,"name":"hai qing"}, {"id":3,"name":"zhang han yu"} ] }
-
查询某一个索引中的全部文档
GET /movie_index/_search
DELETE /movie_index/movie/3
-
根据文档id查看文档
格式:GET/索引名/类型名/文档名id
GET /movie_index/movie/3
-
根据文档id,删除某一个文档
格式:DELETE /索引名/类型名/文档id
删除成功后会给"result"的值标为:"deleted"
-
对文档的修改
语法格式:PUT/索引名/类型名/文档id
PUT /movie_index/movie/3 { "id":300, "name":5.0, "actorList":[ {"id":4,"name":"zhang suishan"} ] }
-
更新某一个文档的字段值
#语法:POST /索引名/类型/文档id/_update POST /movie_index/movie/3/_update { "doc": {"name":"小红"} } #其中要更新的内容必须放在"doc"中
-
批处理
语法格式: POST /索引名/类型名/_bulk
-
需要一:批量创建两个文档
POST /movie_index/movie/_bulk {"index":{"_id":66}} {"id":300,"name":"incident red sea","doubanScore":5.0,"actorList":[{"id":4,"name":"zhang cuishan"}]} {"index":{"_id":88}} {"id":300,"name":"incident red sea","doubanScore":5.0,"actorList":[{"id":4,"name":"zhang cuishan"}]}
-
在一个批量操作中,先更新第一个文档(ID 为 66),再删除第二个文档(ID 为 88)
POST /movie_index/movie/_bulk {"update":{"_id":"66"}} {"doc": { "name": "wudangshanshang" } } {"delete":{"_id":"88"}}
-
-
根据某字段的名称查询(这里根据电影名称查询)
#根据电影名称查询 GET /movie_index/_search { "query":{ "match":{ "name": "operation red sea" } } } #match表示分词查询
-
不分词查询(这里根据影员的名字查询),相当于mysql中的like查询
GET /movie_index/_search { "query": { "match_phrase": { "actorList.name": "zhang han yu" } } } #不分词查询match_phrase
-
不分词,通过精准匹配进行查询 term精准匹配
#不分词,通过精准匹配进行查询 term精准匹配 GET /movie_index/_search { "query": { "term": { "actorList.name.keyword":"zhang han yu" } } } #查询影员名字为"zhang han yu"的电影
-
容错匹配
#容错匹配 GET /movie_index/_search { "query": { "fuzzy": { "name": "rivar" } } }
#这里的rivar原本为:"river",但是也能查询出结果来
-
范围过滤
#范围过滤,将豆瓣评分在6到9的文档查询出来 GET /movie_index/_search { "query": { "range": { "doubanScore": { "gte": 6, "lte": 9 } } } }
-
根据某字段降序排序
#按照豆瓣评分降序排序 GET /movie_index/_search { "sort": [ { "doubanScore": { "order": "desc" } } ] } #"sort"关键字 #"doubanScore":这是文档中的某个字段 #"desc"降序排序的关键字
-
将包含river的所有电影按照评分降序排序
#按照豆瓣评分降序排序 GET /movie_index/_search { "query": { "match": { "name": "river" } }, "sort": [ { "doubanScore": { "order": "desc" } } ] }
-
分页查询
#表示从第一条数据开始,查询一条数据数来 GET /movie_index/_search { "from": 0 , "size": 1 } #from的值表示查询的起始位置,size表示要显示几条数据
-
查询指定字段
GET /movie_index/_search { "_source": ["name","doubanScore"] }
-
将查询的关键字在查询结果中高亮显示出来
#将查询的关键字在查询结果中高亮显示出来 GET /movie_index/_search { "query": { "match": { "name":"river" } }, "highlight": { "fields": {"name":{}} } } #查询结果中river高亮显示
4. 聚合操作
-
需要一:取出每个影员共参演了多少部电影
#aggs 聚合操作的关键字 #myaggs 聚合的名字,自己可以随意取名 #聚合类型,这里选择terms #actorList.name.keyword 表示根据actorList.name分组,但是不分词 GET /movie_index/_search { "aggs": { "myaggs": { "terms": { "field": "actorList.name.keyword", "size": 10 } } } }
-
每个影员参演电影的平均分是多少,并按评分排序
# GET /movie_index/_search { "aggs": { "groupByName": { #分组名 "terms": { "field": "actorList.name.keyword", "size": 10, "order": { "avg_score": "asc" #这里的是在下面求的平均分拍升序 } }, "aggs": { "avg_score": { "avg": { #求平均值 "field": "doubanScore" #求doubanScore字段的平均值 } } } } } } #注意在json代码内部是不可以添加注释的,这里是为了方便注解
5. 分词
-
英文默认分词
GET /_analyze { "text": "hello word" }
-
中文默认分词(不推荐使用)
GET /_analyze { "text": "我是一个非常爱睡觉的人" }