历史文章(文章累计500+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
《国内最全的Spring Boot系列之七》
Elasticsearch可视化平台Kibana [ES系列] - 第498篇
Elasticsearch安装分词插件[ES系列] - 第499篇
ElasticSearch扫盲概念篇[ES系列] - 第500篇
ElasticSearch重建/创建/删除索引操作 - 第501篇
Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。
这一节来看看ES的文档基本操作 – 增删改查。
一、文档操作
1.1 索引文档
- 格式: [PUT | POST] /索引名称/[_doc | _create ]/id
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># 创建文档, 指定id</em></span></code><code><span style="color:#afafaf"><em># 如果id不存在,创建新的文档,否则先删除现有文档,再创建新的文档,版本会增加</em></span></code><code>PUT /es_db/_doc/1</code><code>{</code><code> <span style="color:#dd1144">"name"</span>: <span style="color:#dd1144">"张三"</span>,</code><code> <span style="color:#dd1144">"sex"</span>: 1,</code><code> <span style="color:#dd1144">"age"</span>: 25,</code><code> <span style="color:#dd1144">"address"</span>: <span style="color:#dd1144">"广州天河公园"</span>,</code><code> <span style="color:#dd1144">"remark"</span>: <span style="color:#dd1144">"java developer"</span></code><code>}</code><code><span style="color:#afafaf"><em>#创建文档,ES生成id</em></span></code><code>POST /es_db/_doc</code><code>{</code><code> <span style="color:#dd1144">"name"</span>: <span style="color:#dd1144">"张三"</span>,</code><code> <span style="color:#dd1144">"sex"</span>: 1,</code><code> <span style="color:#dd1144">"age"</span>: 25,</code><code> <span style="color:#dd1144">"address"</span>: <span style="color:#dd1144">"广州天河公园"</span>,</code><code> <span style="color:#dd1144">"remark"</span>: <span style="color:#dd1144">"java developer"</span></code><code>}</code><code></code></span></span>
注意:POST和PUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新
1.2查询文档
- 根据id查询文档,格式: GET /索引名称/_doc/id
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#0e9ce5">GET</span> /es_db/_doc/<span style="color:#0e9ce5">1</span></code></span></span>
- 条件查询 _search,格式: /索引名称/_doc/_search
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># 查询前10条文档</em></span></code><code><span style="color:#0e9ce5">GET</span> /es_db/_doc/_search</code><code></code></span></span>
ES Search API提供了两种条件查询搜索方式:
·REST风格的请求URI,直接将参数带过去
·封装到request body中,这种方式可以定义更加易读的JSON格式
1.2.1 URI Query(了解即可)
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em>#通过URI搜索,使用“q”指定查询字符串,“query string syntax” KV键值对</em></span></code><code></code><code><span style="color:#afafaf"><em>#条件查询, 如要查询age等于28岁的 _search?q=*:***</em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?q=age:28</span></code><code></code><code><span style="color:#afafaf"><em>#范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **] 注意: TO 必须为大写</em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?q=age[25 TO 26]</span></code><code></code><code><span style="color:#afafaf"><em>#查询年龄小于等于28岁的 :<=</em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?q=age:<=28</span></code><code><span style="color:#afafaf"><em>#查询年龄大于28前的 :></em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?q=age:>28</span></code><code></code><code><span style="color:#afafaf"><em>#分页查询 from=*&size=*</em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1</span></code><code></code><code><span style="color:#afafaf"><em>#对查询结果只输出某些字段 _source=字段,字段</em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?_source=name,age</span></code><code></code><code><span style="color:#afafaf"><em>#对查询结果排序 sort=字段:desc/asc</em></span></code><code>GET <span style="color:#dd1144">/es_db/_doc/_search?sort=age:desc</span></code><code></code></span></span>
1.2.2 DSL Query
DSL(Domain Specific Language领域专用语言)查询是使用Elasticsearch的查询语言来构建查询的方式。
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># match 匹配查询,会对查询文本分词后匹配</em></span></code><code>GET /es_db/_search</code><code>{</code><code> <span style="color:#dd1144">"query"</span>: {</code><code> <span style="color:#dd1144">"match"</span>: {</code><code> <span style="color:#dd1144">"address"</span>: <span style="color:#dd1144">"广州白云"</span></code><code> }</code><code> }</code><code>}</code><code></code><code><span style="color:#afafaf"><em># term 词项查询,属于精确查询,不会对查询文本分词</em></span></code><code><span style="color:#afafaf"><em># 思考:能否查到文档?</em></span></code><code>GET /es_db/_search</code><code>{</code><code> <span style="color:#dd1144">"query"</span>: {</code><code> <span style="color:#dd1144">"term"</span>: {</code><code> <span style="color:#dd1144">"address"</span>: <span style="color:#dd1144">"广州白云"</span></code><code> }</code><code> }</code><code>}</code><code></code></span></span>
1.3修改文档
- 全量更新,整个json都会替换,格式: [PUT | POST] /索引名称/_doc/id
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># 全量更新,替换整个json</em></span></code><code>PUT /es_db/_doc/1</code><code>{</code><code> <span style="color:#dd1144">"name"</span>: <span style="color:#dd1144">"张三"</span>,</code><code> <span style="color:#dd1144">"sex"</span>: 1,</code><code> <span style="color:#dd1144">"age"</span>: 25</code><code>}</code><code></code><code><span style="color:#afafaf"><em>#查询文档</em></span></code><code>GET /es_db/_doc/1</code><code></code></span></span>
- 使用_update部分更新,格式: POST /索引名称/_update/id
update不会删除原来的文档,而是实现真正的数据更新
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#afafaf"><em># 部分更新:在原有文档上更新</em></span></code><code><span style="color:#afafaf"><em># Update -文档必须已经存在,更新只会对相应字段做增量修改</em></span></code><code>POST /es_db/_update/1</code><code>{</code><code> <span style="color:#dd1144">"doc"</span>: {</code><code> <span style="color:#dd1144">"age"</span>: 28</code><code> }</code><code>}</code><code></code><code><span style="color:#afafaf"><em>#查询文档</em></span></code><code>GET /es_db/_doc/1</code><code></code></span></span>
- 使用 _update_by_query 更新文档:更新符合条件的文档
<span style="color:#333333"><span style="background-color:#fafafa"><code>POST /es_db/_update_by_query</code><code>{</code><code> <span style="color:#dd1144">"query"</span>: {</code><code> <span style="color:#dd1144">"match"</span>: {</code><code> <span style="color:#dd1144">"_id"</span>: <span style="color:#0e9ce5">1</span></code><code> }</code><code> },</code><code> <span style="color:#dd1144">"script"</span>: {</code><code> <span style="color:#dd1144">"source"</span>: <span style="color:#dd1144">"ctx._source.age = 30"</span></code><code> }</code><code>}</code><code></code></span></span>
1.4并发场景下修改文档
_seq_no和_primary_term是对_version的优化,7.X版本的ES默认使用这种方式控制版本,所以当在高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新:
<span style="color:#333333"><span style="background-color:#fafafa"><code>GET /es_db/_doc/<span style="color:#0e9ce5">1</span></code><code></code><code></code><code>POST /es_db/_doc/<span style="color:#0e9ce5">1</span>?if_seq_no=<span style="color:#0e9ce5">6</span>&if_primary_term=<span style="color:#0e9ce5">1</span></code><code>{</code><code><span style="color:#dd1144">"name"</span>: <span style="color:#dd1144">"李四xxx"</span></code><code>}</code><code></code></span></span>
如果版本号不对,会抛出版本冲突异常,如下图:
1.5删除文档
格式: DELETE /索引名称/_doc/id
<span style="color:#333333"><span style="background-color:#fafafa"><code><span style="color:#0e9ce5">DELETE</span> /es_db/_doc/<span style="color:#0e9ce5">1</span></code></span></span>
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7