Elasticsearch教程(1) Query DSL入门
更多查询可以参考
Elasticsearch笔记(8) term terms exists 查询案例
Elasticsearch笔记(10) ES term terms prefix 搜索 聚合查询 详细总结
Elasticsearch笔记(11) elasticsearch 桶聚合 Query DSL
1. index
1.1 查询所有index
GET /_cat/indices?v
1.2 新增index
#新增一个名为pigg的index
PUT /pigg
1.3 删除index
#删除pigg这个index,产线千万别这么做,删了就完了
DELETE /pigg
2. document
2.1 新增document
2.1.1 新增时指定ID
#指定了文档ID=1
PUT /pigg/_doc/1
{"name": "王冬冬","ename": "winter","age": 32,"about": "I am a good coder","interest": ["eat", "coding"],"interest_count": 2
}#指定了文档ID=2
PUT /pigg/_doc/2
{"name": "朱大旬","ename": "vissy","age": 29,"about": "I am a tester","interest": ["eat", "testing"],"interest_count": 2,"job": null
}#指定了文档ID=3
PUT /pigg/_doc/3
{"name": "王佳冬","ename": "micoo","age": 3,"about": "I am a baby","interest": ["eat", "play", "sleep"],"interest_count": 3,"job": []
}
2.1.2 由ES自动生成ID
用post新增文档,ES自动为文档生成20位的ID
POST /pigg/_doc
{"name": "小波波","age": 2,"about": "I am a cat","interest": ["eat"],"interest_count": 1,"job": [null, "get mouse"]
}
返回结果如下:
{"_index" : "pigg","_type" : "_doc","_id" : "PYiliXABQi7JywF4bswF",//这个就是es自动生成的ID"_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1
}
2.1.3 指定操作类型参数:op_type
新增文档时,可以同时指定op_type,当es里已经存在相同ID的文档时,就会新增失败。
#==指定操作类型op_type=create
PUT /pigg/_doc/3?op_type=create
{"name": "王佳彤","first_name": "jia tong","last_name": "wang","age": 3,"about": "I am a baby","interest": ["eat", "play", "sleep"],"interest_count": 3,"job": []
}
上面等同于:
#指定是create文档
PUT /pigg/_doc/3/_create
{"name": "王佳彤","first_name": "jia tong","last_name": "wang","age": 3,"about": "I am a baby","interest": ["eat", "play", "sleep"],"interest_count": 3,"job": []
}
返回异常信息提示:
"reason": "[_doc][3]: version conflict, document already exists (current version [1])"
2.1.4 指定文档版本号version
每个文档都有一个版本号version,新增后version=1,以后每次修改,version自动加1,也可以指定version,比如让它从1一下子变成10这样。
#先新增一个ID=100的文档
PUT /pigg/_doc/100
{"name": "三爷"
}#返回结果如下,注意这个版本号_version=1
{"_index" : "pigg","_type" : "_doc","_id" : "100","_version" : 1,//注意这个版本号"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 1,"_primary_term" : 1
}
但我们要修改文档前,我们已经知道当前version=1,如果文档被别人修改过,那version肯定大于1。
当我们要修改时,带上version参数(值是我们认定的更新前,当前文档的version值),如果我们指定的与ES里文档相等,则能成功,否则报异常。
#指定跟新前文档现有version=1
PUT /pigg/_doc/100?version=1
{"name": "三爷2"
}#因为中间没有别人操作过id=100的文档,所以修改成功,version变成2
{"_index" : "pigg","_type" : "_doc","_id" : "100","_version" : 2,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1
}
2.1.5 指定了version_type=external
#指定了version_type=external,必须version>当前的version
PUT /pigg/_doc/100?version=10&version_type=external
{"name": "三爷3"
}#返回结果如下,version变成指定的10
{"_index" : "pigg","_type" : "_doc","_id" : "100","_version" : 10,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 4,"_primary_term" : 1
}
2.2 查询document
更多查询可以参考ES Query DSL 词项查询
2.2.1 查询index的所有document
GET /pigg/_search
2.2.1 根据id查询document
GET /pigg/_doc/1?pretty
返回结果:
{"_index" : "pigg","_type" : "_doc","_id" : "1","_version" : 2,"_seq_no" : 1,"_primary_term" : 1,"found" : true,"_source" : {"name" : "王冬冬","ename" : "winter","age" : 32,"about" : "I am a good coder","interest" : ["eat","coding"],"interest_count" : 2}
}
2.2.2 用sort排序查询
#对age进行倒序查询
GET /pigg/_search
{"query": {"match_all": {}},"sort": [{"age": {"order": "desc"}}]
}
2.2.3 用from和size分页查询
#查询前2条数据, from是从0开始的
GET /pigg/_search
{"query": {"match_all": {}},"sort": [{"age": {"order": "desc"}}],"from": 0,"size": 2
}
2.2.4 根据ID判断是否存在
存在返回200,不存在返回404
HEAD /pigg/_doc/1
2.2.5 用_source参数过滤返回的字段
#不返回_source
GET /pigg/_doc/1?_source=false#只返回_source
GET /pigg/_doc/1/_source#只返回ID=1文档的name,age
GET /pigg/_doc/1?_source=name,age#只返回_source中某些字段
GET /pigg/_search
{"_source": ["name", "age"]
}#带上查询条件和_source过滤
GET /pigg/_search
{"query": {"bool": {"filter": {"term": {"age": 3}}}}, "_source": ["name", "age"]
}#只排除某些字段
GET /pigg/_doc/1?_source_exclude=about,interest#判断_source是否存在
HEAD pigg/_doc/1/_source
在ES7.X中,可以有如下写法
GET pigg/_source/1GET pigg/_source/1?_source=field_one
2.3 修改document
2.3.1 用put替换document
查询当前pigg表里id=1的文档
GET /pigg/_doc/1?pretty
返回如下:
{"_index": "pigg","_type": "_doc","_id": "1","_version": 4,"found": true,"_source": {"name": "三爷","age": 29,"hometown": "盐城","gender": "male"}
}
用put方式更新id=1的文档
PUT /pigg/_doc/1
{"name": "盐城三爷"
}
再次查询id=1的文档
{"_index": "pigg","_type": "_doc","_id": "1","_version": 5,"found": true,"_source": {"name": "盐城三爷"}
}
通过上面发现用put是替换了整个文档,而不是更新name这一个字段
2.3.2 用post更新document
先恢复id=1的文档为一开始的数据,然后执行如下语句
修改name,并新增interesting这个字段
POST /pigg/_doc/1/_update?pretty
{"doc":{"name": "盐城冬冬","interesting": "watching TV"}
}
再次查询id=1的文档
{"_index": "pigg","_type": "_doc","_id": "1","_version": 8,"found": true,"_source": {"name": "盐城冬冬","age": 29,"hometown": "盐城","gender": "male","interesting": "watching TV"}
}
这时发现用post更新的是文档的局部字段,原来有的字段更新,没有的字段则新增这个字段
2.3.3 用script更新document
查询当前id=1的人的age是29,现在要对age加1
POST /pigg/_doc/1/_update
{"script": "ctx._source.age += 1"
}
再次查询id=1的文档,发现age已经是30了
{"_index": "pigg","_type": "_doc","_id": "1","_version": 9,"found": true,"_source": {"name": "盐城冬冬","age": 30,"hometown": "盐城","gender": "male","interesting": "watching TV"}
}
2.3.4 用script更新document其他例子
#age-1
POST /pigg/_doc/1/_update
{"script": {"source": "ctx._source.age -= 1"}
}#age=30
POST /pigg/_doc/1/_update
{"script": {"source": "ctx._source.age = 30"}
}#name='witerking'
POST /pigg/_doc/1/_update
{"script": {"source": "ctx._source.name = 'witerking'"}
}#给数组添加一个值,就算存在也添加,语音用painless
POST /pigg/_doc/1/_update
{"script": {"source": "ctx._source.interest.add(params.interest)","lang": "painless","params": {"interest": "sleep"}}
}#给数组添加一个值,不存在才添加,语音用painless
POST /pigg/_doc/1/_update
{"script": {"source": "if(!ctx._source.interest.contains(params.interest)) {ctx._source.interest.add(params.interest)}","lang": "painless","params": {"interest": "sleeping"}}
}#给文档添加一个新字段new_name
POST /pigg/_doc/1/_update
{"script": {"source": "ctx._source.new_name = '傻瓜'","lang": "painless"}
}#字段直接复制
POST /pigg/_doc/1/_update
{"script": {"source": "ctx._source.new_name = ctx._source.name","lang": "painless"}
}#删除一个字段,不修改mapping
POST /pigg/_doc/1/_update
{"script": "ctx._source.remove('new_name')"
}
2.4 删除document
2.4.1 根据ID删除
DELETE /pigg/_doc/1
2.4.2 delete_by_query
#==delete_by_query==
POST /pig/_delete_by_query
{"query": {"term": {"_id": "5"}}
}#忽略版本冲突,继续执行删除操作
POST /pig/_delete_by_query?conflicts=proceed
{"query": {"term": {"_id": "5"}}
}
如果本文对您有帮助,就点个赞
Elasticsearch教程(1) Query DSL入门相关推荐
- Elasticsearch高级查询Query DSL
一.高级查询Query DSL简介 1.Query DSL(简介 Elasticsearch中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified La ...
- ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)
ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...
- python 查询 elasticsearch 常用方法(Query DSL)
2019独角兽企业重金招聘Python工程师标准>>> 1. 建立连接 from elasticsearch import Elasticsearch es = Elasticsea ...
- 15.Elasticsearch 7.15 Query DSL 之 Wildcard查询、Regexp查询
Wildcard查询 介绍 返回包含与通配符模式匹配的文档. 例子 以下搜索返回 user.id 字段包含以 ki 开头并以 y 结尾的文档.这些匹配项可以包括 kiy.kity 或 kimchy G ...
- 13.Elasticsearch 7.15 Query DSL 之 term查询、terms查询和terms set查询
文章目录 term 查询 介绍 term 的顶级参数 field的二级参数 terms查询 介绍 terms的顶级参数 terms set 查询 介绍 terms set的顶级参数 field的二级参 ...
- Elasticsearch之Query DSL语法入门
1. query DSL入门 1.1 DSL query string 后边的参数原来越多,搜索条件越来越复杂,不能满足需求. GET /book/_search?q=name:java&si ...
- Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组
ES High Level REST Client API 查询 聚合 1 准备数据 1.1 插入测试数据 2 Maven引入ES 3 创建Client 4 查询API 4.1 根据id查询单条数据 ...
- Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用
text和keyword区别 term和match区别 ik中文分词器使用 一.前言 二.之前相关的博客 三.造点测试数据 1. 创建一个index 2. 插入测试数据 四.做一份试卷 第1题:tit ...
- Elasticsearch学习1 入门进阶 Linux系统下操作安装Elasticsearch Kibana 初步检索 SearchAPI Query DSL ki分词库 自定义词库
文章目录 一.全文检索-Elasticsearch 1.Elasticsearch简介 2.全文搜索引擎 二.docker安装 1.elasticsearch启动 2.kibana启动 三.[入门]初 ...
- Elasticsearch 教程--入门
1.1 初识 Elasticsearch 是一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,可以说 Lucene 是当今最先进,最高效的全功能开源搜索引擎框架. 但是 L ...
最新文章
- 重温强化学习之基于模型方法:动态规划
- 普通行列转换(交叉表,横表变列表)
- 关于Win7 内存变小处理方法
- underscorejs-groupBy学习
- java中Object.equals()简单用法
- 医疗设备-呼吸机-数据解析
- 【架构师培训课程-技术基础课】
- 《深度学习笔记》——在训练过程中出现nan的调试笔记
- 黑马2018年JavaEE课程大纲
- 一款基于SpringBoot + Spring Security的后台管理系统,强烈推荐,直接用
- 李沐亚马逊资深首席科学家 - 动手学深度学习v2 -2安装
- QVideoWidget遇到的坑。
- 【每日随笔】2021 年终总结 ( 学习和博客 | 技术学习方向 | 专业学习方向 | 写博客的技巧总结 | 工作成果 | 2022 年展望及职业规划 | 对 CSDN 的建议和期望 )
- 【LabVIEW】基于LabVIEW的俄罗斯方块小游戏
- var,let const,const 变量提升
- oracle获取今天是周几,根据DateTime来获取当天是周几(已完结)
- LaTeX行距以及字体大小
- ettercap的应用:DNS欺骗
- css3实现气泡效果的聊天框
- android9壁纸存放路径,Android基础入门教程——10.9 WallpaperManager(壁纸管理器)
热门文章
- 自然语言理解(摘自中南大学课件)
- ARM64 ubuntu20.04根文件系统制作
- 虚拟化软件 VMWare Workstation Player 介绍
- multisim扩大工作区_Multisim介绍:30分钟内学会捕捉、仿真和布局设计
- Java的高薪潮是否已经过去?
- 程序设计基础第四版任务4.1:清华附中有4位同学中的一位做了好事不留名,表扬信来了之后,校长问4位同学是谁做的好事。
- 博图SCL_字符串处理(将上位系统发送字符串解析为ASCLL码)
- git报错:The TLS connection was non-properly terminated.
- 2020牛客多校 Clam and Fish
- 懒羊羊求援【优先队列】