(第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语法教程大全,日积月累相关推荐

  1. JavaScript新手入门教程大全~~~

    JavaScript新手入门教程大全~~~ 一. js教程介绍:JavaScript是一种运行在浏览器中的解释型的编程语言. 那么问题来了,为什么我们要学JavaScript?因为你没有选择.在Web ...

  2. 最详细的语言***教程大全

    最详细的语音***教程大全 http://pan.baidu.com/s/1ANdXc 寻找程序漏洞之狂扫目录 http://pan.baidu.com/s/1ntA0BbF Google Hack语 ...

  3. Java正则表达式教程大全

    转自: Java正则表达式教程大全 Java正则表达式教程大全 在Java代码中,如果你想使用正则表达式,需引入包 java.util.regex,       Java代码中的正则表达式同其它语言的 ...

  4. MySQL语法语句大全

    MySQL语法语句大全 一.SQL速成   ; B/ X* Q; t/ W) v" ]结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表 ...

  5. Bootstrap4+MySQL前后端综合实训-Day01-PM【position定位的四种方式、Flex布局语法教程及案例(概念、容器属性、项目属性)、双飞翼布局复习、Bootstrap4 教程】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记] 目   录 HTML中的三种元素(块元素.内联元素.内联块元素) position定位的四种方式 ...

  6. bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?

    名词是否可数,是非常隐形的扣分点.考生很可能意识不到自己犯错了,毕竟这是中文里不存在的语法点.这类语法点更应该重点备考.越练习,越熟悉,犯错扣分的几率也就越低. OK进入主题↓ 语法解释 官方对可数和 ...

  7. cam350怎么看顶层_蛋糕胚速学教程大全,适合初学者看哦!

    蛋糕胚速学教程大全,适合初学者看哦! 烘焙蛋糕最难的还是装饰,对手残星人来说,好不容易切好了蛋糕胚,抹面费了老大劲还是凹凸不平,做出来像狗狗啃过似的-快来看这份蛋糕抹面技巧,教你做出令人赏心悦目的奶油 ...

  8. TWiki 语法格式(TWiki语法教程及TWiki使用技巧)

    TWiki 语法格式(TWiki语法教程及TWiki使用技巧) Winter 翻译 用TWiki 编辑就和平时直接写文本一样简单 -- 就像写email.如果你喜欢,你可以使用HTML代码,但是并不要 ...

  9. Log4j文件配置教程大全

    Log4j文件配置教程大全~ Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置, ...

最新文章

  1. Java-NIO(九):管道 (Pipe)
  2. JavaScript扩展运算符(...)
  3. buu [BJDCTF 2nd]灵能精通-y1ng
  4. 通信大数据应用未来还有很大的想象空间
  5. 输入输出系统1 ----- 特性 输出输出方式
  6. batch批处理程序easyadd——追加单行文本到指定txt文件末尾
  7. 二鸟在林不如一鸟在手
  8. git日常使用的常用命令总结
  9. 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序...
  10. CSS学习总结(3)——CSS文本样式(属性)
  11. python定义一维数组
  12. 信息技术手册查重错误比对分析程序开发记录3
  13. 虚拟机安装XP操作系统
  14. 2021-08-18我的第一篇博客——STM32单片机的开发环境Keil5(MDK)的安装与破解
  15. 高版本SDK编译apk在低版本android源码中编译
  16. Typora编辑的markdown文档莫名其妙消失或未保存,两种恢复方式
  17. 空气质量等级c语言编程,华中科技大学C语言课设空气质量检测信息管理系统技术分析.docx...
  18. 【更新中】SmartGit 注册码 算法注册机
  19. 【前端】Axios完全使用指南
  20. 假期培训日记(数论)

热门文章

  1. 在没有wifi,没有路由器,没有网线的情况下,如何让笔记本、电脑等设备联网 解决手机热点网络慢的问题
  2. WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connec
  3. Windows 任务管理器 PF使用率 总数 核心内存 物理内存(转)
  4. Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
  5. EBS --PO采购订单
  6. Python教你,谁把你的微信删除了!
  7. 某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,该怎么办?
  8. moviepy音视频剪辑:AudioClip帧处理时报TypeError: only size-1 arrays can be converted to Python scalar错
  9. nyoj 236 心急的C小加(偏序集问题)
  10. 搭建系统|说好了个性化的选股工具!教你定制自己的选股财务数据表?