ElasticSearch入门级教程(一)基本且常用的语法

0.首

对ES的起源、简介等就不赘述了,查看官方文档或者权威指南会更好一些,本章只记录一些偏操作性的基本的东西以供自己复习

1.索引

#创建索引
PUT /player
#删除索引
DELETE /player
#查看所有索引
GET /_cat/indices?v
ElasticSearch入门级教程(一)基本且常用的语法_第1张图片

green- 一切都很好(集群功能齐全)
yellow- 所有数据均可用,但尚未分配一些副本(群集功能齐全)
red- 某些数据由于某种原因不可用(群集部分功能)

在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

「索引」含义的区分
你可能已经注意到索引(index)这个词在Elasticsearch中有着不同的含义,所以有必要在此做一下区分:
索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。
索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
倒排索引 传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。
---- 引自《ElasticSearch权威指南》

#索引文档内容到player索引中
#PUT 索引名/类型名/id
PUT /player/_doc/1
{
“name”:“ferpusi”,
“age”:“20”,
“skill”:“swing”
}
ElasticSearch入门级教程(一)基本且常用的语法_第2张图片
多索引几条数据
ElasticSearch入门级教程(一)基本且常用的语法_第3张图片

2.更新

第一种方法是重新索引,会覆盖掉原来的内容
ElasticSearch入门级教程(一)基本且常用的语法_第4张图片
第二种是使用update,这种不会完全覆盖,只更新指定的数据,如下只更新name,age、skill不会变。
POST /player/_doc/4/_update
{
“doc”: {“name”:“boertr”}
}
在这里插入图片描述

3.批处理

我们上面索引多个数据时,是逐个索引的,也可以批量来处理。示例中批量添加了id为5、6的两组数据
ElasticSearch入门级教程(一)基本且常用的语法_第5张图片

也可以批量进行更新、删除等,更新是只更新指定的内容;而删除只需要指定id,删除的是匹配该id下的全部内容
ElasticSearch入门级教程(一)基本且常用的语法_第6张图片

4.查询

直接写一个覆盖比较多的常用查询,就不拆开来写了
GET /player/_search
{
“query”: {“match”: {
“name”: “kobe”

}} <1>
, “sort”: [
{
“age.keyword”: {
“order”: “asc”
}
}
] <2>
, “size”: 20 <3>
, “_source”: [“name”,“skill”] <4>
}
<1>:匹配name=kobe的内容
<2>:根据age排序
<3>:限制返回20条数据
<4>:只返回name、skill两个字段

从sql角度转化看,类似于这样:
select name,skill from player where name = “kobe” sort by age asc limit 20
结果:
ElasticSearch入门级教程(一)基本且常用的语法_第7张图片
再说一下bool查询, bool的话理解成true或false,也就是我们的查询语句会涉及到true、false。
bool should查询,类似于or,以下为例:name=kobe 或者name=brant的会被匹配到,name=kobe brant的也会被匹配到
ElasticSearch入门级教程(一)基本且常用的语法_第8张图片
bool must查询,理解成and,以下为例,name中必须包含brant和kobe才算匹配上,name=kobe name=brant的都不会命中。
ElasticSearch入门级教程(一)基本且常用的语法_第9张图片
还有bool must_not,代表不包含指定内容,这个就不演示了。
我们演示下组合起来的查询,name必须匹配到kobe,age必须不能等于20
ElasticSearch入门级教程(一)基本且常用的语法_第10张图片
还可以组合filter(过滤)使用,如下
ElasticSearch入门级教程(一)基本且常用的语法_第11张图片

5.聚合

聚合单独拉出来看
类似于sql中的group by等聚合函数,以下为例,对age聚合,结果分为两部分,第一部分是正常的查询结果,而聚合结果作为第二部分单独展示出来,如截图中框选部分。*customname处填写的是自定义的名字
ElasticSearch入门级教程(一)基本且常用的语法_第12张图片
如果只想看聚合结果,只需要加size=0即可。
ElasticSearch入门级教程(一)基本且常用的语法_第13张图片
再看一下avg这样的聚合,用刚才的索引来做avg聚合的话,会发现报了“Expected numeric type on field [age.keyword], but got [keyword]”这样的错,这是因为

【在进行avg和sum等Metrics Aggregations(度量聚合)的时候报错的,进行数学维度的计算,期望得到一个数字字段,但是得到的是一个String的keyword类型,若把my_field.keyword换成my_field,则又会包上一个错误。则需要在index数据之前进行mapping配置,将该字段的值定义为numeric,或者开启mapping的Numeric detection(数字探测)】

ElasticSearch入门级教程(一)基本且常用的语法_第14张图片
重新添加索引,开启mapping的Numeric detection

PUT aggagg
{
  "mappings": {"_doc":{"numeric_detection": true}}
}

然后按之前的方式添加数据,这里我加了两条,然后开始聚合,可以看到,已经成功计算出avg了
ElasticSearch入门级教程(一)基本且常用的语法_第15张图片
聚合中的嵌套是逐层嵌套,有依赖关系的,这一点要注意。

你可能感兴趣的:(ES)