Elasticsearch增删改查 之 —— mget多文档查询
之前说过了针对单一文档的增删改查,基本也算是达到了一个基本数据库的功能。本篇主要描述的是多文档的查询,通过这个查询语法,可以根据多个文档的查询条件,返回多个文档集合。 更多内容可以参考我整理的ELK文档教程
multi Get
多字段查询可以设置多个文档查询条件,每个查询条件在结构上都比较类似:
curl 'localhost:9200/_mget' -d '{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1"
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2"
}
]
}'
当然,在查询条件中,body中_index字段也可以放在查询字符串中:
curl 'localhost:9200/test/_mget' -d '{
"docs" : [
{
"_type" : "type",
"_id" : "1"
},
{
"_type" : "type",
"_id" : "2"
}
]
}'
对于type也是一样:
curl 'localhost:9200/test/type/_mget' -d '{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2"
}
]
}'
如果索引和类型都放在查询URL中,那么字段ID就可以放在一个数组中:
curl 'localhost:9200/test/type/_mget' -d '{
"ids" : ["1", "2"]
}'
type可选
mget查询中类型type是可选的。如果设置_all或者不设置,就会匹配所有的类型,那么仅仅会返回第一个匹配的文档。
但是如果没有设置type,然后查询的id里面又出现两个一样的id,就会返回第一次匹配的文档两次:
curl 'localhost:9200/test/_mget' -d '{
"ids" : ["1", "1"]
}'
因此如果想要查询到不同类型的id,就需要指定类型名称:
GET /test/_mget/
{
"docs" : [
{
"_type":"typeA",
"_id" : "1"
},
{
"_type":"typeB",
"_id" : "1"
}
]
}
_source过滤
默认_source
字段会返回所有的内容,你也可以通过_source
进行过滤。比如使用_source
,_source_include
,_source_exclude
.
比如:
curl 'localhost:9200/_mget' -d '{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1",
"_source" : false
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2",
"_source" : ["field3", "field4"]
},
{
"_index" : "test",
"_type" : "type",
"_id" : "3",
"_source" : {
"include": ["user"],
"exclude": ["user.location"]
}
}
]
}'
Fields过滤
与其他的普通查询差不多,mget查询也支持Fields过滤。
curl 'localhost:9200/_mget' -d '{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1",
"fields" : ["field1", "field2"]
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2",
"fields" : ["field3", "field4"]
}
]
}'
也可以在URL中的查询字符串中设置默认的过滤,然后在Body中进行特殊的修改:
curl 'localhost:9200/test/type/_mget?fields=field1,field2' -d '{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2",
"fields" : ["field3", "field4"]
}
]
}'
id1的文档就会返回field1和field2,id2的文档就会返回field3和field4.
路由
在mget查询中也会涉及到路由的问题。可以在url中设置默认的路由,然后在Body中修改:
curl 'localhost:9200/_mget?routing=key1' -d '{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1",
"_routing" : "key2"
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2"
}
]
}'
在上面的例子中,test/type/1
按照key2
这个路由锁定分片进行查询;test/type/2
按照key1
这个路由锁定分片进行查询。
实际演练
首先创建两个文档:
curl -XPOST localhost:9200/test/_mget?pretty -d '{"ids":["1"]}'
curl -XPOST localhost:9200/test/testb/1?pretty -d '{"name":"b","age":122}'
如果不指定type,那么返回的仅仅是一个最先匹配的结果:
$ curl -XPOST localhost:9200/test/_mget?pretty -d '{"ids":["1"]}' {
"docs" : [ {
"_index" : "test",
"_type" : "testb",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"name" : "b",
"age" : 122
}
} ]
}
如果指定了重复的id,则返回的是多次第一次匹配的文档:
$ curl -XPOST localhost:9200/test/_mget?pretty -d '{"ids":["1","1"]}' {
"docs" : [ {
"_index" : "test",
"_type" : "testb",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"name" : "b",
"age" : 122
}
}, {
"_index" : "test",
"_type" : "testb",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"name" : "b",
"age" : 122
}
} ]
}
如果指定了类型,再去查询,则返回的是各自的id:
$ curl -XPOST localhost:9200/test/_mget?pretty -d '{"docs":[{"_type":"testa","_id":"1"},{"_type":"testb","_id":"1"}]}'
{
"docs" : [ {
"_index" : "test",
"_type" : "testa",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "a",
"age" : 31
}
}, {
"_index" : "test",
"_type" : "testb",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"name" : "b",
"age" : 122
}
} ]
}
- [编程经验] 链家23个全国主要城市的现房数据分析
- [编程经验] Python中的modlue和packages的区别
- Day5上午解题报告
- [编程经验] Pandas中比较好用的几个方法
- [编程经验] Elasticsearch 初识
- 2017.10.26水题大作战部分题解
- 2017.10.27涩会题大乱斗部分题解
- 【 关关的刷题日记50】 Leetcode 345. Reverse Vowels of a String
- Day1上午解题报告
- 【 关关的刷题日记51】 Leetcode 67. Add Binary
- 【 关关的刷题日记53】 Leetcode 100. Same Tree
- Day1下午解题报告
- 【关关的刷题日记54】Leetcode 226. Invert Binary Tree
- Day2上午解题报告
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 60分钟看懂HMM的基本原理
- R语言确实会蛮耗费磁盘空间哦
- 很多时候你就是不知道如何提问
- seurat标准流程实例之2个10x样本的项目(GSE135927数据集)
- 使用 Jenkins 和 Ansible 实现 CI/CD
- 太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!
- 被 Google 选择的下一代数据面 Cilium 是什么 - 上手实践
- K8S 生态周报| 是时候从 k8s v1.16 升级了
- ESP8266(一)| 基于OneNet的温度采集显示系统
- 隐秘的 MySQL 类型转换
- 对Jenkinsfile语法说不,开源项目Jenkins Json Build挺你
- Volatile概述
- SparkStreaming和Kafka基于Direct Approach如何管理offset
- Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
- 美团点评2020年测试工程师笔试题