Elasticsearch是以Restful 风格来命名自己的API的,因此这节就以此来学习下Elasticsearch的基本用法。
基本用法
API基本格式:http://<ip>:<port>/<索引>/<类型>/<文档id>
常用http动词:GET/PUT/POST/DELETE
创建索引
打开我们的head插件:http://localhost:9100/
点击索引-创建索引 如图:
填写索引名称、分片数、被分数(默认为5个分片1个备份),注意分片创建成功后无法修改,备份数可随意修改
,创建完成后如图所示:
book为索引名称,01234为5个分片,粗线框为主分片,细线框为备份分片,对应关系如:细线框0为粗线框0的备份,以此类推,通常备份和主分片在不同的节点上,这样一个节点挂了还有备份分片。
以上为非结构化索引,相反还有结构化索引,那么怎么区分呢?
点击上面的信息-索引信息
出现如图:查看里面的结构化关键词mappings,为空则为非结构化索引
那么如果创建结构化索引呢:
点击复合查询
输入如下格式:
点击易读-验证JSON
正确后提交,在点击信息-索引信息
查看mappings有结构映射的,即为格式化的索引
以上我们创建索引是在head插件了,但head并不是很完美,这里我推荐使用postman
这个工具,他是一个具有http请求的模拟器,可以自动验证json格式,具体用法可以百度下很简单,如图创建people这个索引:
基本增删改查
插入文档
指定文档id插入
自动产生文档id插入
文档id是一个唯一索引值指向我们的文档数据
下面我们来插入一条数据
可以看到已经插入成功,可以去head插件查看具体信息,这里解释下120.0.0.1:9200/people/man/1
peolpe为创建的文档索引man为文档类型1为文档id,因此这里是指定文档id插入
,而自动产生文档id插入
只需将请求的动词PUT
改为POST
地址120.0.0.1:9200/people/man/1
改为120.0.0.1:9200/people/man
即可,这时的id就会自动帮我们生成,是随机的一行字符串,点击head插件的数据浏览
即可看到结果
修改文档
直接修改文档
:请求的动词PUT
改为POST
地址120.0.0.1:9200/people/man/1
改为120.0.0.1:9200/people/man/1/_update
即可,参数加上doc
如:
{
"doc":{
"name":"哈哈"
}
}
脚本修改文档
:请求方式地址同上,参数改为
{
"script":{
"lang":"painless", //指定脚本语言
"inline":"ctx._source.age += 10" //脚本内容
}
}
ctx:上下文,_source:当前文档内容 指在原来年龄上加10
{
"script":{
"lang":"painless",
"inline":"ctx._source.age = params.age",
"params":{
"age":100
}
}
}
这种方式可以指定年龄为多少
删除文档
设置请求方式为DELETE
地址为120.0.0.1:9200/people/man/1
即可删除id为1的文档
删除索引
设置请求方式为DELETE
地址为120.0.0.1:9200/people
即可,或者在head插件直接删除,需要注意删除索引后将索引下的数据也会删除掉
查询
简单查询
:设置请求方式为GET
地址为120.0.0.1:9200/people/man/1
即查询id为1的文档
条件查询
:设置请求方式为POST
地址为120.0.0.1:9200/people/_search
各种查询条件(参数:均以query为关键词)为:
{
"query":{
"match_all":{} //查询所有
},
"from":0, //查询数据的起始位置
"size":1 //返回的数据条数
}
{
"query":{
"match":{
"name":"小王" //条件查询,名字为小王的数据,默认会查到含有小王任意一个字的所有数据局,改为match_phrase只查包含小王的数据,改为term更精准查询,只查是小王的数据
}
},
"sort":[ //排序,按时间倒序
{
"date":{
"order":"desc"
}
}
]
}
聚合查询
:设置请求方式为POST
地址为120.0.0.1:9200/people/_search
关键字为aggs
查询条件为:
{
"aggs":{
"group_by_age":{ //指定查询结果的名字
"terms":{ //查询统计不同年龄的个数
"field":"age"
}
},
"group_by_date":{
"terms":{
"field":"date" //查询不同日期的个数
}
}
}
}
//可以设置多个分组
{
"aggs":{
"grades_age":{ //指定查询结果的名字
"stats":{ //查询统计年龄的个数最大最小值平均值等
"field":"age"
}
}
}
}
//stats可改为其他如:min为查最小值
高级查询
子条件查询
:特定子弹查询所指特定值,又分为Query context
和Filter context
Query context
:在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的有多好
模糊查询
:设置请求方式为POST
地址为120.0.0.1:9200/people/_search
查询条件为:
{
"query":{
"multi_match":{
"query":"小花",
"fields":["name","country"]
}
}
}
//查询name和country中有小花数据
语法查询
:设置请求方式为POST
地址为120.0.0.1:9200/people/_search
查询条件为:
{
"query":{
"query_string":{ //语法查询关键字
"query":"小花 or 小明",
"fields":["name","country"]
}
}
}
查询小花 or 小明在name和country两个子段的数据
范围查询
:设置请求方式为POST
地址为120.0.0.1:9200/people/_search
查询条件为:
{
"query":{
"range":{
"age":{
"gt":20, //大于20
"lte":27 //小鱼等于27 ,e是equals的意思等于
}
}
}
}
//查询年龄大于20小鱼等于27的数据
Filter context
:在查询过程中,只判断文档是否满足条件,只有YES或者NO,Filter就是过滤的作用,只差复合Filter条件的数据,效率比query要快,必须要和bool配合使用
{
"query":{
"bool":{
"filter":{
"term":{
"age":22 }
}
}
}
}
//查询年龄为22的数据
复合条件查询
:以一定的逻辑组合子条件查询
{
"query":{
"bool":{
"must":[ //必须满足下面两个条件,与的关系,改为should就是或的关系及满足之一就可以,改为must_not为一定不满足
{
"match":{
"name":"小明" }
},{
"match":{
"country":"小花" }
}
],
"filter":[ //拦截年龄为22的
{
"term":{
"age":22 }
}
]
}
}
}
//查询必须满足name包含小明和country包含小花且年龄为22的数据