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": "我是一个非常爱睡觉的人"
}
|