管理索引常用的API

二.管理索引常用的API

1.查看现有索引信息

复制代码
查看所有索引信息列表:
	curl -X GET http://elk101.k8s.com:9200/_cat/indices?v

查看某个索引的详细信息:
	curl -x GET http://elk101.k8s.com:9200/linux-2020-10-2

温馨提示: 
	(1)"?v"表示输出表头信息,如下所示:
        health status index           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
        green  open   linux-2020-10-1 JDAp11N8RVqyjGROol3J4Q   1   1          0            0       416b           208b
        green  open   bigdata         3k606BwcTIWZOHG3tRPMNA   5   2          0            0        3kb            1kb
        green  open   linux-2020-10-3 8DJBzgo2Sn2qwe-UDa8_RA   1   1          0            0       416b           208b
        green  open   linux-2020-10-2 NsO3vA-JTZ61W4OH4OqGxw   1   1          0            0       416b           208b
        green  open   linux           I0jNRp0wT8OgvR9Uf6EZow   1   1          0            0       416b           208b
        green  open   bigdata3        h1OS5CX6TomeDY_dcdy-vQ   3   1          0            0      1.2kb           624b
        green  open   bigdata2        egmZVZS6QqCpACPBe2-1LA   1   1          0            0       416b           208b
	(2)curl默认发送的就是GET请求;


以下是对响应结果进行简单的说明:
	health:
		green:
			所有分片均已分配。
		yellow:
			所有主分片均已分配,但未分配一个或多个副本分片。如果群集中的节点发生故障,则在修复该节点之前,某些数据可能不可用。
		red:
			未分配一个或多个主分片,因此某些数据不可用。在集群启动期间,这可能会短暂发生,因为已分配了主要分片。
	status:
		索引状态,分为打开和关闭状态。
	index:
		索引名称。
	uuid:
		索引唯一编号。
	pri:
		主分片数量。
	rep:
		副本数量。
	docs.count:
		可用文档数量。
	docs.deleted:
		文档删除状态(逻辑删除)。
	store.size:
		主分片和副分片整体占空间大小。
	pri.store.size:
		主分片占空间大小。

2.创建索引

复制代码
curl -X PUT http://elk101.k8s.com:9200/bigdata

可选提交的数据如下:
    {
        "settings": {
            "index": {
                "number_of_replicas": "1",
                "number_of_shards": "3"
            }
        }
    }
    
  
温馨提示:
	(1)对于提交的参数说明:
		"number_of_replicas"参数表示副本数。
		"number_of_shards"参数表示分片数。
	(2)对于返回的参数说明:
		"acknowledged"参数表示响应结果,如果为"true"表示操作成功。
		"shards_acknowledged"参数表示分片结果,如果为"true"表示操作成功。
		"index"表示索引名称。
	(3)创建索引库的分片数默认为1片,在7.0.0之前的Elasticsearch版本中,默认为5片。
	(4)如果重复添加索引,会返回错误信息;

3.删除索引[生产环境中谨慎操作,建议先使用关闭索引一段时间在进行删除]

复制代码
根据索引模式删除:
	curl -X DELETE http://elk101.k8s.com:9200/linux-2020-11*
	
删除某个特定的索引:
	curl -X DELETE http://elk101.k8s.com:9200/linux-2020-10-2

4.查看某个索引是否存在

复制代码
curl -X HEAD http://elk101.k8s.com:9200/linux-2020-10-2

温馨提示:
	注意观察返回的状态码,如果返回"200"说明该索引是存在的,如果返回"400",说明索引是不存在的。

5.索引别名

复制代码
curl -X POST http://elk101.k8s.com:9200/_aliases

提交数据如下:
	(1)添加别名:
        {
          "actions" : [
            { "add" : { "index" : "linux-2020-10-3", "alias" : "linux2020" } },
            { "add" : { "index" : "linux-2020-10-3", "alias" : "linux2021" } }
          ]
        }
        
	(2)删除别名
        {
          "actions" : [
            { "remove" : { "index" : "linux-2020-10-3", "alias" : "linux2025" } }
          ]
        }

	(3)重命名别名
        {
          "actions" : [
            { 
                "remove" : { "index" : "linux-2020-10-3", "alias" : "linux2023" } 
            },
            {
                "add": { "index" :"linux-2020-10-3" , "alias" : "linux2025" }
            }
          ]
        }
	
	(4)为多个索引同时添加别名
        {
          "actions" : [
            {
                "add": { "index" :"bigdata3" , "alias" : "linux666" }
            },
            {
                "add": { "index" :"bigdata2" , "alias" : "linux666" }
            },
            {
                "add": { "index" :"linux-2020-10*" , "alias" : "linux666" }
            }
          ]
        }


温馨提示:
	(1)索引别名是用于引用一个或多个现有索引的辅助名称。大多数Elasticsearch API接受索引别名代替索引;
	(2)加索引后请结合"elasticsearch-head"的WebUI进行查看;
	(3)一个索引可以关联多个别名,一个别名也能被多个索引关联;

6.关闭索引

复制代码
关闭某一个索引:
	curl -X POST http://elk101.k8s.com:9200/linux-2020-10-1/_close

关闭批量索引:
	curl -X POST http://elk101.k8s.com:9200/linux-2020-*/_close

温馨提示:
	(1)如果将索引关闭,则意味着该索引将不能执行任何打开索引状态的所有读写操作,当然这样也会为服务器节省一定的集群资源消耗;
	(2)生产环境中,我们可以将需要删除的索引先临时关闭掉,可以先关闭7个工作日,然后在执行删除索引,因为光关闭索引尽管能减少消耗但存储空间依旧是占用的;
	(3)关闭索引后,记得查看现有索引信息,并结合"elasticsearch-head"插件的WebUI界面进行查看哟;

7.打开索引

复制代码
打开某一索引:
	curl -X POST  http://elk101.k8s.com:9200/linux-2020-10-3/_open
	
打开批量索引:
	curl -X POST  http://elk101.k8s.com:9200/linux-2020-*/_open

8.其它操作

复制代码
推荐阅读:
	https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html

三.管理文档的基本操作API

1.添加文档

复制代码
使用POST方法创建文档,创建文档时会自动生成随机文档的"_id"(推荐方式):
	curl -X POST http://elk101.k8s.com:9200/shopping/_doc

使用POST方法创建文档,我们也可以自定义文档文档的"_id":(不推荐使用,因为在数据量比较大的时候,自定义"_id"可能会存在如何去重的情况)
	curl -X POST http://elk101.k8s.com:9200/shopping/_doc/10010

使用PUT方法创建文档姿势一:
	curl -X PUT http://elk101.k8s.com:9200/shopping/_doc/10011
	
使用PUT方法创建文档姿势二:
	curl -X PUT http://elk101.k8s.com:9200/shopping/_create/10012

提交以下数据:
    {
        "title":"戴尔(DELL)31.5英寸 4K 曲面 内置音箱 低蓝光 影院级色彩 FreeSync技术 可壁挂 1800R 电脑显示器 S3221QS",
        "price":3399.00 ,
        "brand": "Dell",
        "weight": "15.25kg",
        "item": "https://item.jd.com/100014940686.html"
    }


温馨提示:
	PUT方法要求幂等性,二POST方法则并不要求幂等性。所谓的幂等性可参考请求的"_id"和响应返回的"_id"是否一致。

2.查询文档

复制代码
主键查询:
	curl -X GET http://elk101.oldboyedu.com:9200/shopping/_doc/10012
	
全查询:
	curl -X GET http://elk101.oldboyedu.com:9200/shopping/_search
	
判断文档是否存在:(只需要观察响应的状态码,如果为200说明文档存在,如果是404说明文档不存在)
	curl -X HEAD http://elk101.oldboyedu.com:9200/shopping/_doc/x0zdh3kBpj8F95BSQ5Pv
	

一个文档中不仅仅存在数据,它还包含了元数据(metadata),即关于文档的信息。换句话说,就是描述数据的数据。

三个必须的元数据节点是"_index","_type"和"_id":
	"_index":
		文档添加到的索引名称,即文档存储的地方。
		索引(index)类似于关系型数据库里的"数据库",它是我们存储和索引关联数据的地方。
		事实上,我们的数据被存储和索引在分片(shards)中,索引是把一个或多个分片分组在一起的逻辑空间。
		然而,这只是一些内部细节,我们的程序完全不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch关心既可。
	"_type":
		文件类型。Elasticsearch索引现在支持单一文档类型_doc。
		
	"_id":
		添加文档的唯一标识符。
		id仅仅是一个字符串,它与"_index"和"_type"组合时,就可以在Elasticsearch中唯一标识一个文档。
		当创建一个文档时,你可以自定义"_id",也可以让Elasticsearch帮你自动生成(32位长度)。

温馨提示:
	如果用浏览器查看返回数据可能看起来不太美观,我们可以借助"pretty"参数来使得输出的可读性更强。当然,我们也可以借助插件哟~

3.更新文档

复制代码
全局更新:(生产环境使用较少)
	curl -X PUT/POST http://elk101.oldboyedu.com:9200/shopping/_doc/10012
        {
            "title": "ALIENWARE外星人新品外设高端键鼠套装AW510K机械键盘cherry轴 RGB/AW610M 610M 无线鼠标+510K机械键盘+510H耳机",
            "price": 5200.00,
            "brand": "ALIENWARE外星人",
            "weight": "1.0kg",
            "item": "https://item.jd.com/10030370257612.html"
        }
        
局部更新:(生产环境经常使用)
	curl -X POST http://elk101.oldboyedu.com:9200/shopping/_update/10012
	curl -X POST http://elk101.oldboyedu.com:9200/shopping/_doc/10012/_update
        {
            "doc":{
                "price": 6000.00,
                "weight": "2.0kg"
            }
        }
        
   

温馨提示:
	更新局部数据时,说明每一次更新数据返回的结果都不相同,因此我们不应该使用PUT方法,而是使用POST方法哟~

4.删除文档

复制代码
curl -X DELETE http://elk101.oldboyedu.com:9200/shopping/_doc/10012

四.ElasticSearch的DSL查询语言

1.条件查询

复制代码
基于请求路径实现条件查询:
	curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search?q=brand:DELL
	
基于请求体实现条件查询:
	curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "match":{
                    "brand":"DELL"
                }
            }
        }	

基于请求体实现全量查询:
	curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
	可选的以下请求体:
        {
            "query":{
                "match_all":{

                }
            }
        }

2.分页查询

复制代码
	假设有20条数据,我们规定每页仅有3条数据,我们想要查看第7页的数据,就可以执行下面的查询语句。
	
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "match_all":{

                }
            },
            "from": 18,
            "size": 3
        }

	字段说明:
        from:
            指定跳过的数据偏移量大小,默认是0。
            查询指定页码的from值 = "(页码 - 1) * 每页数据条数"。
        size:
            指定显示的数据条数大小,默认是10。

	在集群系统中深度分页:
		我们应该当心分页太深或者一次请求太多的结果,结果在返回前会被排序。
		但是记住一个搜索请求常常涉及多个分片。
		每个分片生成排好序的结果,它们接着需要集中起来排序以确保整体排序顺序。
		
	为了理解为什么深度分页是有问题的,让我们假设在一个有5个主分片的索引中搜索:
        (1)当我们请求结果的第一页(结果1到10)时,每个分片产生自己最顶端10个结果然后返回它们给请
        求节点(requesting node),它在排序这所有的50个结果以筛选出顶端的10个结果;
        (2)现在假设我们请求第1000页,结果10001到10010,工作方式都相同,不同的时每个分片都必须
        产生顶端的10010个结果,然后请求节点排序这50050个结果并丢弃50040个;
        (3)你可以看到在分布式系统中,排序结果的花费随着分页的深入而成倍增长,这也是为什么网络
        搜索引擎中任何语句返回多余1000个结果的原因;

3.只查看返回数据的指定字段

复制代码
	假设有20条数据,我们规定每页仅有3条数据,我们想要查看第7页的数据,并只查看"brand"和"price"这两个字段,就可以执行下面的查询语句。
	
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "match_all":{

                }
            },
            "from": 18,
            "size": 3,
            "_source": ["brand","price"]
        }

4.查看指定字段并排序

复制代码
	假设有20条数据,我们规定每页仅有3条数据,我们想要查看第7页的数据,并只查看"brand"和"price"这两个字段,就可以执行下面的查询语句。
	
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
       {
            "query":{
                "match_all":{

                }
            },
            "from": 18,
            "size": 3,
            "_source": ["brand","price"],
            "sort":{
                "price":{
                    "order":"desc"
                }
            }
        }
        
	温馨提示:
		"desc"表示降序排列,而"asc"表示升序排列。

5.多条件查询

复制代码
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
    
    使用must查询,则查询结果必须满足所有的匹配要求,缺一不可:
        {
            "query":{
                "bool":{
                    "must":[
                        {
                            "match":{
                             "price": 429
                            }
                        },
                        {
                            "match":{
                                "brand": "罗技"
                            }
                        }
                    ]
                }
            }
        }
        
    使用should查询,则查询结果只须满足其中一个匹配的要求即可:
        {
            "query":{
                "bool":{
                    "should":[
                        {
                            "match":{
                             "price": 429
                            }
                        },
                        {
                            "match":{
                                "brand": "DELL"
                            }
                        }
                    ]
                }
            }
        }

	使用"minimum_should_match"参数实现最少满足需求的文档数查找:
        {
            "query":{
                "bool":{
                    "should":[
                        {
                            "match":{
                             "brand": "华为"
                            }
                        },
                        {
                            "match":{
                                "brand": "小米"
                            }
                        },
                        // {
                        //     "match":{
                        //         "brand": "苹果"
                        //     }
                        // },
                        {
                           "match":{
                                "price": "4699"
                            }
                        }
                    ],
                    "minimum_should_match": 2  // 至少要满足2个should需求才能获取到对应的文档哟~
                }
            }
        }

	使用"minimum_should_match"参数实现最少满足需求的文档数查找,采用百分比案例:
        {
            "query":{
                "bool":{
                    "should":[
                        {
                            "match":{
                             "brand": "华为"
                            }
                        },
                        {
                            "match":{
                                "brand": "小米"
                            }
                        },
                        // {
                        //     "match":{
                        //         "brand": "苹果"
                        //     }
                        // },
                        {
                           "match":{
                                "price": "4699"
                            }
                        }
                    ],
                    "minimum_should_match": "60%"  //可以适当调大,比如调到70%观察命中结果!
                }
            }
        }
        

    温馨提示:
    	bool查询可以用来合并多个条件查询结果的布尔逻辑,这些参数可以分别继承一个查询或者一个查询条件的数组。
    	bool查询包含以下操作符:
    		must:
            	多个查询条件的完全匹配,相当于"and"。
            must_not:
            	多个查询条件的相反匹配,相当于"not"。
            should:
                至少有一个查询条件匹配,相当于"or"。
                
	评分计算规则:
		(1)bool查询会为每个文档计算相关度评分"_score",再将所有匹配的must和should语句的分数"_score"求和,最后除以must和should语句的总数。
		(2)must_not语句不会影响评分,它的作用只是将不相关的文档排除。
		(3)默认情况下,should中的内容不是必须匹配的,如果查询语言中没有must,那么就会至少匹配其中一个。当然,也可以通过"minimum_should_match"来指定匹配度,该值可以是数字(例如"2")也可以是
百分比(如"65%")。

6.范围查询

复制代码
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "bool":{
                    "must":[
                        {
                            "match":{
                                "brand": "罗技"
                            }
                        }
                    ],
                    "filter":{
                        "range":{
                            "price":{
                                "gt": 100,
                                "lt":300
                            }
                        }
                    }
                }
            }
        }
        
	温馨提示:
		(1)上面的查询条件是匹配"brand"的值"罗技"的数据并按照"price"进行范围过滤;
		(2)常用的范围操作符包含如下所示:
            gt:
            	大于。
            gte:
            	大于等于。
            lt:
            	小于。
            lte:
            	小于等于。

7.全文检索

复制代码
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "match":{
                    "brand":"小华苹"
                }
            }
        }

   温馨提示:
   		(1)尽管我们没有"小华苹"的品牌,但ES在查询的时候会对"小华果"进行文字拆分,会使用倒排索引技术去查找文档,从而查到小米, 华为,苹果的品牌。
   		(2)match查询会在真正查询之前用分词器先分析,默认的中文分词器并不太适合使用,生产环境建议更换分词器,比如IK分词器等。

8.完全匹配

复制代码
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "match_phrase":{
                    "brand":"小华果"
                }
            }
        }
        
	温馨提示:
		我们可以使用"match_phrase"进行完全匹配,则返回0条匹配结果。

9.语法高亮

复制代码
    curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search
        {
            "query":{
                "match_phrase":{
                    "brand":"苹果"
                }
            },
            "highlight":{
                "fields":{
                    "brand":{}
                }
            }
        }

10.精确匹配查询

复制代码
curl -X PUT http://elk101.oldboyedu.com:9200/shopping/_search	

    {
        "query": {
            "term": {
               "price": 4699 // 查询字段的值尽量不要使用中文哟~如果非要用,建议使用特定的分词器!
            }
        }
    }
    
    
    {
        "query": {
            "terms": {
                "price": [299,4066,499]
            }
        }
    }

温馨提示:
	term主要用于精确匹配哪些值,比如数字,日期,布尔值或"not_analyzed"(未经分析的文本数据类型)的字符串。
	terms跟term有点类似,但terms允许指定多个匹配条件,如果某个字段指定了多个值,那么文档需要一
定去做匹配。

11.查询包含指定字段的文档

复制代码
    curl -X POST http://elk101.oldboyedu.com:9200/teacher/_search
        {
            "query": {
                "exists": {
                    "field": "hobby"  // 只查询含有"hobby"字段的文档。
                }
            }
        }

	温馨提示:
		(1)关于"teacher"索引的数据生成,可直接参考下面的"批量操作"创建数据的案例。
		(2)exists查询可以用于查找文档中是否包含指定字段或没有某个字段,这个查询只是针对已经查出一批数据来,但是想区分出某个字段是否存在的时候使用。

12.过滤查询

复制代码
    curl -X POST http://elk101.oldboyedu.com:9200/teacher/_search
        {
            "query":{
                "bool":{
                    "filter":{
                        "term":{
                            "hobby":"linux"
                        }
                    }
                }
            }
        }
        
	match和filter查询对比:
        (1)一条过滤(filter)语句会询问每个文档的字段值是否包含着特定值;
        (2)查询(match)语句会询问每个文档的字段值与特定值的匹配程序如何:一条查询(match)语句会计算每个文档与查询语句的相关性,会给出一个相关性评分"_score",并且按照相关性对匹配到的文档进行排序。这种评分方式非常适用于一个没有完全配置结果的全文本搜索。
        (3)一个简单的文档列表,快速匹配运算并存入内存是十分方便的,每个文档仅需要1个字节。这些缓存的过滤结果集与后续请求的结果使用是非常高效的;
        (4)查询(match)语句不仅要查询相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比过滤语句更好使,并且查询结果也不可缓存。

	温馨提示:
		做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。但如果要做全文搜索,需要通过查询语句来完成。

13.多词搜索

复制代码
(1)默认基于"or"操作符对某个字段进行多词搜索
curl -X GET http://elk101.oldboyedu.com:9200/shopping/_search

    {
        "query":{
            "bool":{
                "must":{
                    "match":{
                        "title":{
                            "query":"曲面设计",
                            "operator":"or"
                        }
                    }
                }
            }
        },
        "highlight":{
            "fields":{
                "title":{}
            }
        }
    }
    
 
(2)基于"and"操作符对某个字段进行多词搜索
curl -X GET http://elk101.oldboyedu.com:9200/shopping/_search
    {
        "query":{
            "bool":{
                "must":{
                    "match":{
                        "title":{
                            "query":"曲面",
                            "operator":"and"
                        }
                    }
                }
            }
        },
        "highlight":{
            "fields":{
                "title":{}
            }
        }
    }

14.权重案例(了解即可)

复制代码
	有些时候,我们可能需要对某些词增加权重来影响这条数据的得分。

curl -X GET http://elk101.oldboyedu.com:9200/shopping/_search

    {
        "query": {
            "bool": {
                "must": {
                    "match": {
                        "brand": {
                            "query": "小米",
                            "operator": "or"
                        }
                    }
                },
                "should": [
                    {
                        "match": {
                            "title": {
                                "query": "防水",
                                "boost": 10
                            }
                        }
                    },
                    {
                        "match": {
                            "title": {
                                "query": "黑色",
                                "boost": 2
                            }
                        }
                    }
                ]
            }
        },
        "highlight": {
            "fields": {
                "title": {}
            }
        }
    }

15.聚合查询

复制代码
	curl -X GET/POST http://elk101.oldboyedu.com:9200/shopping/_search

	按照brand字段进行分组:
        {
            "aggs":{  // 聚合操作
                "brand_group":{  // 该名称可以自定义,我习惯性基于相关字段起名称。
                    "terms":{  // 分组
                        "field":"brand.keyword"  // 指定用于计算的相关字段,此处指定的时brand字段,但brand字段的fielddata默认值为false,因此此处我们需要写brand.keyword"
                    }
                }
            },
            "size": 0 // 设置显示hits数据的大小,当size的值为0时,表示不查看原始数据!如果设置大于0,则显示指定的数据条数。如果设置为-1,则只显示10条,如果设置小于-1则报错!
        }
        
    按照"price"字段计算所有商品的平均值:
        {
            "aggs":{  // 聚合操作
                "price_avg":{  // 该名称可以自定义,我习惯性基于相关字段起名称。
                    "avg":{  // 分组
                        "field":"price"  // 分组字段
                    }
                }
            },
            "size": 0 // 设置显示hits数据的大小,当size的值为0时,表示不查看原始数据!如果设置大于0,则显示指定的数据条数。如果设置为-1,则只显示10条,如果设置小于-1则报错!
        }

五.批量操作

1.为什么要使用批量操作

复制代码
	有些情况下可以通过批量操作以减少网络请求,也可以实现可重复性的利用率。例如:批量查询,批量插入数据。

2.批量插入操作

复制代码
	温馨提示:
		元数据最少要写一个在Elasticsearch中,支持批量的插入,修改,删除操作,都是通过"_bulk"的API完成的。

	批量插入请求格式如下:(请求格式不同寻常)
        { action: { metadata }}\n
        { request body }\n
        { action: { metadata }}\n
        { request body }\n
        ...
        
    批量插入数据:
		curl -X POST http://elk101.oldboyedu.com:9200/_bulk
            {"create":{"_index":"teacher","_type":"_doc","_id":9001}}
            {"id":1001,"name":"oldboy","gender":"Male","telephone":"1024","address":"北京沙河","hobby":"linux 象棋 羽毛球 跑步"}
            {"create":{"_index":"teacher","_type":"_doc"}}
            {"id":1002,"name":"吉泽明步","gender":"Female","telephone":"2048"}
            {"create":{"_index":"teacher","_type":"_doc","_id":9002}}
            {"id":1003,"name":"苍老师","gender":"Female","telephone":"4096","address":"日本东京"}
            {"create":{"_index":"teacher"}}
            {"id":1004,"name":"加藤鹰","gender":"Male","telephone":"8192"}
            {"create":{"_index":"teacher","_id":9003}} 
            {"id":1004,"name":"小园梨央","gender":"Female","address":"日本东京","hobby":"自拍、拉拉队"}


	温馨提示:
		从上面的案例可以看出,元数据最少要写一个"_index"。而对应的提交的请求体则可以根据我们的需求自定义即可。

3.批量查询操作

复制代码
curl -X POST http://elk101.oldboyedu.com:9200/teacher/_mget
    {
        "ids":["9001","9002","9003","9005"] // 查询ID为"9001","9002","9003","9005"的数据。
    }	
    
温馨提示:
	注意观察响应的结果,如果数据没有查询到,则found"的值为false。

4.批量删除数据

复制代码
	在Elasticsearch中,支持批量的插入,修改,删除操作,都是通过"_bulk"的API完成的。
	
	批量删除请求格式如下:(请求格式不同寻常)
        { action: { metadata }}\n
        { action: { metadata }}\n
        { action: { metadata }}\n
        
	批量删除数据:
    	curl -X POST http://elk101.oldboyedu.com:9200/teacher/_doc/_bulk
            {"delete":{"_index":"teacher","_type":"_doc","_id":9001}}
            {"delete":{"_index":"teacher","_id":9002}}
            {"delete":{"_index":"teacher","_id":9003}}
            {"delete":{"_index":"teacher","_id":9005}}

	温馨提示:
		(1)关于URL的"_doc"其实是可以省略不写的,我此处是一个习惯性操作,表示是对文档的操作;
		(2)请求体最后最后一行一定要有一个换行符;
		(3)删除数据的结果查看响应体的"result"字段,如果为"not_found",则说明数据未删除,因为没有找到该文档;

5.一次性批处理多少性能最高

复制代码
	ES提供了Bulk API支持批量操作,当我们有大量的写任务时,可以使用Bulk来进行批量写入。

	对于批量操作,我们一次性批量多少操作性能最高呢?我们不得不参考以下几点:
		(1)整个批量请求需要被加载到接收我们请求节点的内存里,所以请求越大,给其它请求可用的内存就越小。有一个最佳的bulk请求大小。超过这个大小,性能不能提升而且可能降低;
		(2)最佳大小,当然并不是一个固定的数字,它完全取决于你的硬件,你文档的大小和复杂度以及索引和搜索的负载;
		(3)幸运的是,这个最佳点(sweetspot)还是容易找到的,试着批量索引标准的文档,随着大小的增长,当性能开始降低,说明你批次的大小太大了。开始的数量可以在1000-5000个文档之间,如果你的文档非常大,可以使用较小的批次;
		(4)通常着眼于你请求批次的物理大小是非常有用的,1000个1KB的文档和1000个1MB的文档大不相同,一个好的批次最好保持在5~15MB逐渐增加,当性能没有提示时,把这个数据量作为最大值;
		(5)bulk默认设置批量提交的数据量不能超过100M;

六.其它查询操作

1.ElasticSearch中支持的类型(了解即可)

复制代码
	前面我们创建的索引以及插入数据,都是由Elasticsearch进行自动判断。

	有些时候我们需要进行明确的字段类型的,否则,自动判断的类型和实际需求是不相符的。

	此处我针对字符串类型做一个简单的说明:(因为上面的案例的确用到了)
        string类型(deprecated,已废弃):
            在ElasticSearch旧版本中使用较多,从ElasticSearch 5.x开始不再支持string,由text和keyword类型代替。

        text类型:
            当一个字段要被全文搜索的,比如Email内容,产品描述,应该使用text类型。
            设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分词器分成一个一个词项。
            text类型的字段不用于排序,很少用于聚合。
            换句话说,text类型是可拆分的。

        keyword类型:
            适用于索引结构化的字段,比如email地址,主机名,状态码,标签,IP地址等。
            如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章),排序,聚合。keyword类型的字段只能通过精确值搜索到。
            换句话说,keyword类型是不可拆分的。

	关于ElasticSearch的详细的数据类型并不是我们运维人员所关心的,因为这些是开发人员去研究的,感兴趣的小伙伴卡自行参考官方文档。

    推荐阅读:
        https://www.elastic.co/guide/en/elasticsearch/reference/7.12/mapping-types.html

2.映射关系

复制代码
推荐阅读:
	https://www.elastic.co/guide/en/elasticsearch/reference/7.12/mapping.html


创建索引:
	curl -X PUT http://elk101.oldboyedu.com:9200/teacher
        {
            "settings": {
                "index": {
                    "number_of_replicas": "1",
                    "number_of_shards": "5"
                }
            }
        }
       
添加索引的映射关系:
	curl -X PUT http://elk101.oldboyedu.com:9200/teacher/_mapping
        {
            "properties":{
                "name":{
                    "type":"text", // 该类型是文本类型,该类型存储的数据是可以被拆分的。
                    "index":true
                },
                "gender":{
                    "type":"keyword",  // 该类型是关键字类型,该类型存储的数据是不可被拆分的
                    "index":true
                },
                "telephone":{
                    "type":"text",
                    "index":false  // 如果字段的"index"为false,则无法使用该字段进行数据查找!
                },
                "address":{
                    "type":"keyword",
                    "index":false
                }
            }
        }

往索引中添加数据:
	curl -X PUT http://elk101.oldboyedu.com:9200/teacher/_create/10001
        {
            "name":"oldboy",
            "gender":"男性的",
            "telephone":"1024",
            "address":"北京沙河"
        }
        
测试各个映射字段是否可以查询数据:
	curl -X GET http://elk101.oldboyedu.com:9200/teacher/_search

	(1)基于"name"字段可以查询到数据:
        {
            "query":{
                "match":{
                    "name":"oldboy"
                }
            }
        }

	(2)基于"gender"字段可以查询到数据:
        {
            "query":{
                "match":{
                    "gender":"男性的"  // 注意,此处必须完全匹配,如果不完全匹配则查询不到数据哟~因为"gender"字段被我们显式定义为"keyword"类型啦~
                }
            }
        }
        
	(3)基于"telephone"字段无法查询到数据:
        {
            "query":{
                "match":{
                    "telephone":1024
                }
            }
        }

	(4)基于"address"字段无法查询到数据:
        {
            "query":{
                "match":{
                    "address":"北京沙河"
                }
            }
        }

七.管理集群常用的API

1.查看集群的健康状态信息

复制代码
curl -X GET  http://elk101.k8s.com:9200/_cluster/health?wait_for_status=yellow&timeout=50s&pretty

温馨提示:
	(1)wait_for_status表示等待ES集群达到状态的级别;
	(2)timeout表示指定等待的超时时间;
	(3)pretty表示美观的输出响应体,尤其是在浏览器输入;

以下是对响应结果进行简单的说明:
    cluster_name
        集群的名称。
    status
        集群的运行状况,基于其主要和副本分片的状态。
        常见的状态为:
            green:
                所有分片均已分配。
            yellow:
                所有主分片均已分配,但未分配一个或多个副本分片。如果群集中的节点发生故障,则在修复该节点之前,某些数据可能不可用。
            red:
                未分配一个或多个主分片,因此某些数据不可用。在集群启动期间,这可能会短暂发生,因为已分配了主要分片。
    timed_out:
        如果false响应在timeout参数指定的时间段内返回(30s默认情况下)。
    number_of_nodes:
        集群中的节点数。
    number_of_data_nodes:
        作为专用数据节点的节点数。
    active_primary_shards:
        活动主分区的数量。
    active_shards:
        活动主分区和副本分区的总数。
    relocating_shards:
        正在重定位的分片的数量。
    initializing_shards:
        正在初始化的分片数。
    unassigned_shards:
        未分配的分片数。
    delayed_unassigned_shards:
        其分配因超时设置而延迟的分片数。
    number_of_pending_tasks:
        尚未执行的集群级别更改的数量。
    number_of_in_flight_fetch:
        未完成的访存次数。
    task_max_waiting_in_queue_millis:
        自最早的初始化任务等待执行以来的时间(以毫秒为单位)。
    active_shards_percent_as_number:
        群集中活动碎片的比率,以百分比表示。

2.获取集群的配置信息(了解即可)

复制代码
查看集群的信息:
	curl -X GET  http://elk101.k8s.com:9200/_cluster/settings?include_defaults

修改集群的信息:
	curl -X PUT http://elk101.k8s.com:9200/_cluster/settings
        { 
          "persistent": { 
            "cluster.routing.allocation.enable": "none"
          }
        }

温馨提示:
	(1)默认情况下,此API调用仅返回已显式定义的设置,包括"persistent"(持久设置)和"transient"(临时设置);
	(2)其中include_defaults表示的是默认设置;

3.查看集群的统计信息(了解即可)

复制代码
curl -X GET https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html

返回参数说明:
	https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html

4.查看集群shard分配的分配情况(了解即可)

复制代码
curl -X PUT  http://elk101.k8s.com:9200/_cluster/allocation/explain

提交的参数如下:
	(1)查看未分配的主分片原因
        {
          "index": "linux-2020-10-3",
          "shard": 0,
          "primary": true
        }

	(2)查看未分配的副本分片原因
        {
          "index": "linux-2020-10-3",
          "shard": 0,
          "primary": false
        }
	
返回的参数说明:
	https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-allocation-explain.html

温馨提示:
	当您试图诊断shard未分配的原因或碎片为什么在您可能期望的情况下继续留在当前节点时,此API非常有用。

5.其他操作(了解即可)

复制代码
推荐阅读:
	https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster.html