Elasticsearch7.X语法教程大全,日积月累
(第17版)
本文基于Elasticsearch7.X及以上版本,7以下版本注意在操作索引和文档时或需要添加_doc字段
一、Rest语法概述
二、索引管理
1. 创建索引
PUT /index_name
{"settings": { "number_of_shards":2,"number_of_replicas":1},"mappings": {"properties": {"id":{"type": "integer"},"name":{"type": "keyword"},"age":{"type": "long"},"desc":{"type": "text"},"birthday":{"type": "date"}}}
}
settings设置有好多,上面只写了分片和副本数量。
2. 修改索引字段
注:只能新增字段,不能删除字段
POST /index_name/_mapping
{"properties": {"title":{"type": "text"}}
}
3. 删除索引
DELETE /index_name
4. 查看索引字段类型
GET /index_name/_mapping
5. 索引数据转移,旧索引数据复制到新索引
POST /_reindex{"source": {"index": "index_name_old"},"dest": {"index": "index_name_new",(提前创建好)"version_type": "external"}}
6. 查看索引列表-健康状态
GET _cat/health
7. 查看索引列表-详细信息
GET _cat/indices?v
8. 查看ik分词情况
GET _analyze
{"analyzer": "ik_smart","text": "支付就用支付宝"}
9. 查看ik分词,最细粒度划分
GET _analyze
{"analyzer": "ik_max_word","text": "支付就用支付宝"}
三、文档管理
1. 创建文档PUT/POST
区别:put文档必须要指定文档_id;post可指定,可不指定,不指定则会随机生成一个_id
情况1:如果没有提前设定索引中字段类型而直接添加文档,es会对字段数据给自动数据类型,新字段会永久补充进去mapping。
情况2:如果添加的数据字段数量大于提前设定索引中字段数量,可成功,按情况1处理。
情况3:如果添加的数据字段数量小于提前设定索引中字段数量,更可成功。
put指定id
PUT /index_name/_doc/1
{"id":1001,"name":"张三","age":12,"desc":"我的自我描述","birthday":"2020-02-02"
}
post指定id
POST /index_name/_doc/3
{"id":1002,"name":"张三","age":12,"desc":"我的自我描述","birthday":"2020-02-02"
}
post不指定id,自动给_id
POST /index_name/_doc
{"id":1003,"name":"张三","age":12,"desc":"我的自我描述","birthday":"2020-02-02"
}
2. 查询文档
查询所有文档
GET /index_name/_search
查询指定文档
GET /index_name/_doc/1
3. 修改文档
全修改:PUT和POST都可以,全部字段均会被修改更新
POST /index_name/_doc/1
{"id":1005,"name":"张三","age":12,"desc":"我的自我描述","birthday":"2020-02-02"
}
部分修改:POST,只修改部分字段数据
POST /index_name/_doc/1/_update
{"doc":{"name":"李四"}
}
4. 删除文档
根据id删除指定文档
DELETE /index_name/_doc/1
5.清空指定索引全部文档
POST index_name/_delete_by_query
{"query": {"match_all": {}}
}
根据查询条件清理部分文档
POST index_name/_delete_by_query
{"query":{"bool":{"filter":[{"range":{"birthday":{"gte":"2020-06-01 00:00:00","lt":"2020-07-01 00:00:00"}}}]}}
}
四、复杂查询
语句条件:match匹配查询、bool联合查询、term精确查询
约束条件:must、must_not、should、filter
1. match匹配查询
首先我拿match对desc查询,因为desc是text类型可以进行分词查询;name是keyword不分词,不支持分词查询。
实测,下面的查询结果会查询到desc中包含"%张%" 或 "%三%" 或 "%李%"的文档。
注:张三不是一个词,会被分词器给分开,哇。。。。这样岂不是能查很多,确实,尽量少用match查询text,不够精准。
GET /index_name/_search
{"query":{"match":{"desc":"张三 李"}}
}
2. bool联合查询,通常搭配must,should,must_not,filter
(1)must、must_not 条件查询,必须满足,类似mysql中and的用法
GET /index_name/_search
{"query":{"bool":{"must":[{"match":{"desc":"三 四"}},{"match": {"age": 12}}]}}
}
(2)should 条件查询,需要满足,并且是或者的关系,类似mysql中or的用法
GET /index_name/_search
{"query":{"bool":{"should":[{"match":{"desc":"三 四"}},{"match": {"age": 12}}]}}
}
(3)filter 过滤查询
GET /index_name/_search
{"query":{"bool":{"must":[{"match":{"desc":"三 四"}}],"filter": [{"range": {"age": {"gte": 10,"lt": 13}}}]}}
}
3. term精确查询: 通过倒排索引进行精确查找,用的最多
·
match原理是先分析文档,通过分词器进行解析,然后再去文档中查询。
·
term直接进行精确查询,term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。
·
match_phrase短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致。
(1)简单查询
GET /index_name/_search
{"query": {"term": {"desc":"三" }}
}
(2)多条件复合查询
注:term不会分词查询,只是精确查询!!!必须要查满足 “小三” 的文档
GET /index_name/_search
{"query":{"bool":{"must": [{"term": {"desc": "小三"}},{"term": {"age": 11}}]}}
}
terms表示多条件并列,用大括号 [ ] 涵盖所查内容,类似于MySql中in方法
GET /index_name/_search
{"query":{"bool":{"must": [{"terms": {"age": [10,11,12]}}]}}
}或者GET /index_name/_search
{"query":{"bool":{"must": [{"terms": {"desc": ["我","三"]}}]}}
}
多重混合,这个也是用到较多的
GET /index_name/_search
{"query":{"bool":{"must":[{"term":{"desc":"三"}},{"terms":{"age":[10,11,12]}}]}}
}
must和must_not混合,这里面留意区别下term 和 match条件的不同含义
GET /index_name/_search
{"query":{"bool":{"must":[{"term":{"name":"张三"}}],"must_not":[{"term":{"age":"10"}},{"match":{"desc":"描述"}}]}}
}
尤其注意must和should并列的情况:must和should不可以直接并列,must和must_not可以直接并列
假如,要查姓名叫“张三”,年龄为12岁或者出生日期为2020-02-03的个人信息,一定要注意了。
就好比: name=张三 && age=15 || birthday=2020-02-03这种错误一样,这是不对的。逻辑上似乎说的过去,但在严谨的数学上可不行,并且就算在mysql中也不可以这么写,因为and优先级大于or,会先执行and并列条件,好在mysql中可以将条件括起来,改正为 where name='张三' and (age=12 or birthday='2020-02-03')。
错误的写法: 即便是把age和birthday都放在should里面,elasticsearch也不认。
GET /index_name/_search
{"query":{"bool":{"must":[{"match":{"name":"张三"}}],"should":[{"match":{"age":"12"}},{"match":{"birthday":"2020-02-03"}}]}}
}
正确的逻辑是:(name=张三 && age=15) || (name=张三 &&birthday=2020-02-03),
正确的写法:先对should分出情况,再给每一种情况进行must约束
GET /index_name/_search
{"query":{"bool":{"should":[{"bool":{"must":[{"term":{"name":"张三"}},{"term":{"age":12}}]}},{"bool":{"must":[{"term":{"name":"张三"}},{"term":{"birthday":"2020-02-03"}}]}}]}}
}
4. 聚合查询collapse和aggs,将重复内容进行折叠(去重)
GET /index_name/_search
{"query":{"bool":{"must":[{"term":{"moduleAttr":6424}},{"terms":{"sortId":[1,72,101]}}],"filter":[{"range":{"pubTime":{"gte":"2020-07-11 09:13:04"}}}]}},"sort":[{"pubTime":{"order":"desc"}}],"collapse":{"field":"contentId"},"size":20
}或者GET index_name/_search
{"query":{"bool":{"must":{"terms":{"websiteId":[2141391797]}},"filter":{"range":{"pubTime":{"gte":"2020-04-20 00:00:00","lte":"2020-07-31 23:59:59"}}}}},"aggs": {"my_name(自定义名字)": {"terms": {"field": "contentId" }}
},"size":10
}
5. 高亮查询
默认高亮格式查询
GET /index_name/_search
{"query":{"match":{"desc":"自我描述"}},"highlight": {"fields": {"desc": {}}}
}
自定义高亮代码
GET /index_name/_search
{"query":{"match":{"desc":"自我描述"}},"highlight": {"pre_tags": "<p style='color:red'>" ,"post_tags": "</p>", "fields": {"desc": {}}}
}
6. 最后说几个常用查询筛选条件:
从上到下,分别是只显示需要返回的字段、查询条件、排序规则、分页从0页开始size为2
GET /index_name/_search
{"_source":{"includes":["name","age","desc"]},"query":{"match":{"name":"张三"}},"sort":[{"age":{"order":"desc"}}],"from": 0,"size": 2
}
五、复杂条件修改/删除
1. 条件修改_update_by_query
将desc中含有“三”的数据,desc修改为“张3新的自我介绍”。
POST /index_name/_update_by_query
{"script":{"source":"ctx._source['desc']='张3新的自我介绍'"},"query":{"bool":{"must":[{"term":{"desc":"三"}}]}}
}
2. 条件删除_delete_by_query
将desc中含有“3”的数据删除
POST /index_name/_delete_by_query
{"query":{"bool":{"must":[{"term":{"desc":"3"}}]}}
}
3.清空索引数据
POST /index_name/_delete_by_query
{"query": {"match_all": {}}
}
六、Elasticsearch Painless Script
官网解释,自Elasticsearch 5.x 引入Painless,使得Elasticsearch拥有了安全、可靠、高性能脚本的解决方案。
简单来说就是支持通过Painless脚本语言的方式,对es进行查询、修改、删除等操作,为es提供了更强大的一种操作方式。
doc
只可以在_search中访问到。如果是修改操作,使用的是ctx
。
https://blog.csdn.net/u013613428/article/details/78134170#%E6%89%B9%E9%87%8F%E6%9B%B4%E6%96%B0
1. 条件修改
POST /index_name/_update_by_query
{"script":{"lang":"painless","source":"ctx._source.title=params.newTitile","params":{"newTitile":"修改为新的titile"}},"query":{"bool":{"filter":[{"range":{"crawlTime":{"gte":"2020-09-01 00:00:00","lt":"2020-09-03 00:00:00"}}}]}}
}
或者修改title,在titile后面加一句“加一个后缀”
POST /index_name/_update_by_query
{"script":{"lang":"painless","source":"ctx._source.title= ctx._source.title+'加一个后缀'"},"query":{"bool":{"filter":[{"range":{"crawlTime":{"gte":"2020-09-01 00:00:00","lt":"2020-09-03 00:00:00"}}}]}}
}
不过这里我也遇到个问题,根据官网文档,我想replace修改keyword字段,但报错,不知道有没有大神可以解释的。
七、集群管理
1. 查看集群的基本健康状态
GET /_cat/health?v
2. 查看集群详细状态
GET _cluster/health?pretty
3. 查看集群中所有的分片
GET /_cat/shards
4. 查看集群所有节点
GET /_cat/nodes?v
5. 查看集群所有节点详细信息
GET _nodes/process?pretty
八、生命周期管理
生命周期也可以在kibana中可视化操作
1. 创建生命周期
#(自定义生命周期名称article_ilm_policy)
PUT /_ilm/policy/article_ilm_policy
{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_docs":"50000000"}}},"warm":{"min_age":"15d","actions":{"allocate":{"include":{"box_type":"warm"},"number_of_replicas":0},"forcemerge":{"max_num_segments":1}}},"cold":{"min_age":"30d","actions":{"allocate":{"include":{"box_type":"cold"}}}},"delete":{"min_age":"60d","actions":{"delete":{}}}}}
}
2. 查看生命周期
GET /_ilm/policy/article_ilm_policy
3. 删除生命周期
DELETE /_ilm/policy/article_ilm_policy
4. 索引rollover操作
POST index_name/_rollover/
{"conditions": {"max_docs": 1000,"max_age": "7d", "max_size": "5gb"}
}
九、索引模板管理
索引模板也可以在kibana中可视化操作
1. 查看当前所有模板
GET _template
2. 查看指定模板规则
GET _template/article_ilm_template
3. 创建模板,当然模板中settings不仅下面这些属性配置,还可指定分词器analysis、过滤器等,下述为基础简单配置。
//设定索引模板
PUT /_template/article_ilm_template
{"index_patterns":["article*"(索引匹配规则,满足article为前缀的索引以此模板创建,这个要写好,瞎写或者写复杂了容易导致索引找不到模板)],"aliases": {"article": {}(规定新索引的别名,这里有bug,如果写上这个索引别名,但滚动索引会跟下面rollover_alias重复冲突,引起rollover失败,建议不写这个配置,第一个索引采用手动创建别名)},"settings":{"number_of_shards":9,(主分片数)"number_of_replicas":1,(副本数)"index.lifecycle.name":"article_ilm_policy",(规定索引遵从哪个生命周期)"index.lifecycle.rollover_alias":"article",(规定rollover索引别名)"index.routing.allocation.include.box_type":"hot",(让所有符合命名规则索引的 Shard 都将被分配到 Hot Nodes 节点上)},"mappings":{"properties":{"title":{"type":"text"}}}
}
5. 别名
//写入和读取,都是根据共同的别名article进行的,他们别名一样
//设置别名,如果别名不对的话,就无法查询到此article-test索引
//设置允许写入写入"is_write_index":true ,否则无法写入数据,集群只能规定一个写入的索引//创建索引,指定别名
PUT article-test(需要修改的索引)
{"aliases":{"article(别名)":{"is_write_index":true}}
}//另一种写法,修改别名,指定索引:POST /_aliases
{"actions":[{"add":{"index":"article-test",(需要修改的索引)"alias":"article",(别名)"is_write_index":true}}]
}
6.路由索引
路由决定如何分配文档到各个节点,默认路由是文档的_id,通过将_id算法取余保证平均散步数据。
shard_num = hash(_routing) % num_primary_shards
但是如果查很久之前比如1年前的数据,那就要从1年前时间开始查询所有节点至今的数据量,其实也没毛病,但消耗大。
这时候可以用路由进行优化,设定路由参数,如同给文档打标签一样,将带有相同路由的文档分配到同一节点,查询/修改这些文档的时候也带有路由参数去查,这样只查部分节点数据就能获取想要的数据。
具体用法,有时间再亲测写,先感谢粘一篇帖子https://blog.csdn.net/u010454030/article/details/73554652
今天我就是在这遇到坑了,索引模板里面有路由必填的设置,索引mapping中有路由限制,搞得我无法写入文档到索引,报错
routing_missing_exception
将模板中这个去掉,重新生成索引解决
Elasticsearch7.X语法教程大全,日积月累相关推荐
- JavaScript新手入门教程大全~~~
JavaScript新手入门教程大全~~~ 一. js教程介绍:JavaScript是一种运行在浏览器中的解释型的编程语言. 那么问题来了,为什么我们要学JavaScript?因为你没有选择.在Web ...
- 最详细的语言***教程大全
最详细的语音***教程大全 http://pan.baidu.com/s/1ANdXc 寻找程序漏洞之狂扫目录 http://pan.baidu.com/s/1ntA0BbF Google Hack语 ...
- Java正则表达式教程大全
转自: Java正则表达式教程大全 Java正则表达式教程大全 在Java代码中,如果你想使用正则表达式,需引入包 java.util.regex, Java代码中的正则表达式同其它语言的 ...
- MySQL语法语句大全
MySQL语法语句大全 一.SQL速成 ; B/ X* Q; t/ W) v" ]结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表 ...
- Bootstrap4+MySQL前后端综合实训-Day01-PM【position定位的四种方式、Flex布局语法教程及案例(概念、容器属性、项目属性)、双飞翼布局复习、Bootstrap4 教程】
[Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记] 目 录 HTML中的三种元素(块元素.内联元素.内联块元素) position定位的四种方式 ...
- bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?
名词是否可数,是非常隐形的扣分点.考生很可能意识不到自己犯错了,毕竟这是中文里不存在的语法点.这类语法点更应该重点备考.越练习,越熟悉,犯错扣分的几率也就越低. OK进入主题↓ 语法解释 官方对可数和 ...
- cam350怎么看顶层_蛋糕胚速学教程大全,适合初学者看哦!
蛋糕胚速学教程大全,适合初学者看哦! 烘焙蛋糕最难的还是装饰,对手残星人来说,好不容易切好了蛋糕胚,抹面费了老大劲还是凹凸不平,做出来像狗狗啃过似的-快来看这份蛋糕抹面技巧,教你做出令人赏心悦目的奶油 ...
- TWiki 语法格式(TWiki语法教程及TWiki使用技巧)
TWiki 语法格式(TWiki语法教程及TWiki使用技巧) Winter 翻译 用TWiki 编辑就和平时直接写文本一样简单 -- 就像写email.如果你喜欢,你可以使用HTML代码,但是并不要 ...
- Log4j文件配置教程大全
Log4j文件配置教程大全~ Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置, ...
最新文章
- Java-NIO(九):管道 (Pipe)
- JavaScript扩展运算符(...)
- buu [BJDCTF 2nd]灵能精通-y1ng
- 通信大数据应用未来还有很大的想象空间
- 输入输出系统1 ----- 特性 输出输出方式
- batch批处理程序easyadd——追加单行文本到指定txt文件末尾
- 二鸟在林不如一鸟在手
- git日常使用的常用命令总结
- 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序...
- CSS学习总结(3)——CSS文本样式(属性)
- python定义一维数组
- 信息技术手册查重错误比对分析程序开发记录3
- 虚拟机安装XP操作系统
- 2021-08-18我的第一篇博客——STM32单片机的开发环境Keil5(MDK)的安装与破解
- 高版本SDK编译apk在低版本android源码中编译
- Typora编辑的markdown文档莫名其妙消失或未保存,两种恢复方式
- 空气质量等级c语言编程,华中科技大学C语言课设空气质量检测信息管理系统技术分析.docx...
- 【更新中】SmartGit 注册码 算法注册机
- 【前端】Axios完全使用指南
- 假期培训日记(数论)
热门文章
- 在没有wifi,没有路由器,没有网线的情况下,如何让笔记本、电脑等设备联网 解决手机热点网络慢的问题
- WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connec
- Windows 任务管理器 PF使用率 总数 核心内存 物理内存(转)
- Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
- EBS --PO采购订单
- Python教你,谁把你的微信删除了!
- 某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,该怎么办?
- moviepy音视频剪辑:AudioClip帧处理时报TypeError: only size-1 arrays can be converted to Python scalar错
- nyoj 236 心急的C小加(偏序集问题)
- 搭建系统|说好了个性化的选股工具!教你定制自己的选股财务数据表?