elasticsearch之单请求多查询
一、需要解决的问题
有的时候我们需要同时执行多个查询,并且需要得到每个单独查询的搜索结果,elasticsearch提供了multi search此需求的支持;
二、elasticsearch multi search简介
elasticsearch提供了multi search api来支持一个请求执行多个查询;
multi search api的请求体使用换行分割的JSON格式;
header\n
body\n
header\n
body\n
multi search返回的结果是responses数组,每个查询对应一个数组元素;每个数组元素都有一个status字段指示查询是否执行成功,如果执行失败则error字段返回错误信息;
每个查询可以通过自己的header设置查询执行的index,也可以是空的JSON对象,这是在URL中指定的index执行查询;
三、数据准备
index以下四个文档
PUT /multi_test/_doc/1
{
"name":"Google Chrome"
}
PUT /multi_test/_doc/2
{
"name":"NotePad"
}
PUT /multi_test/_doc/3
{
"name":"Word"
}
PUT /multi_test/_doc/4
{
"name":"PyCharm"
}
查询查看已经索引的数据
GET /multi_test/_search
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":4,
"max_score":1,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"2",
"_score":1,
"_source":{
"name":"NotePad"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"4",
"_score":1,
"_source":{
"name":"PyCharm"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"1",
"_score":1,
"_source":{
"name":"Google Chrome"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"3",
"_score":1,
"_source":{
"name":"Word"
}
}
]
}
}
四、查询测试
我们构造以下四个查询同时执行
POST /multi_test/_msearch
{}
{"query":{"match":{"name":"google"}}}
{}
{"query":{"match":{"name":"nohit"}}}
{}
{"query":{"match":{"name":"word"}}}
{}
{"query":{"bool":{"should":[{"match":{"name":"word"}}, {"match":{"name":"pycharm"}}]}}}
我们可以看到不管查询是否命中结果,都会有一个responses数组元素对应;同时responses数组元素的顺序与查询是一 一对应的;
{
"responses":[
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":0.2876821,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"1",
"_score":0.2876821,
"_source":{
"name":"Google Chrome"
}
}
]
},
"status":200
},
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":0,
"max_score":null,
"hits":[
]
},
"status":200
},
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":0.2876821,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"3",
"_score":0.2876821,
"_source":{
"name":"Word"
}
}
]
},
"status":200
},
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":2,
"max_score":0.6931472,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"4",
"_score":0.6931472,
"_source":{
"name":"PyCharm"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"3",
"_score":0.2876821,
"_source":{
"name":"Word"
}
}
]
},
"status":200
}
]
}
五、multi search对search template的支持
multi search api也支持search template;
muti search内联search template查询
POST /multi_test/_msearch/template
{}
{ "source" : "{ \"query\": { \"match\": { \"name\" : \"{{name}}\" } } } }", "params": { "name": "google" } }
{}
{ "source" : "{ \"query\": { \"match_{{template}}\": {} } }", "params": { "template": "all" } }
查询结果为
{
"responses":[
{
"took":0,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":0.2876821,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"1",
"_score":0.2876821,
"_source":{
"name":"Google Chrome"
}
}
]
}
},
{
"took":8,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":4,
"max_score":1,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"2",
"_score":1,
"_source":{
"name":"NotePad"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"4",
"_score":1,
"_source":{
"name":"PyCharm"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"1",
"_score":1,
"_source":{
"name":"Google Chrome"
}
},
{
"_index":"multi_test",
"_type":"_doc",
"_id":"3",
"_score":1,
"_source":{
"name":"Word"
}
}
]
}
}
]
}
也可以直接新建search template
POST /_scripts/multi_test_name_template/
{
"script":{
"lang":"mustache",
"source":{
"query":{
"bool":{
"should":[
{
"match":{
"name":"{{name}}"
}
},
{
"wildcard":{
"name":"*{{name}}*"
}
}
]
}
}
}
}
}
使用新建的search template进行搜索
POST /multi_test/_msearch/template
{}
{ "id": "multi_test_name_template", "params": { "name": "oo" } }
{}
{ "id": "multi_test_name_template", "params": { "name": "notepad" } }
搜索结果如下
{
"responses":[
{
"took":1,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":1,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"1",
"_score":1,
"_source":{
"name":"Google Chrome"
}
}
]
}
},
{
"took":1,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":1.6931472,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"2",
"_score":1.6931472,
"_source":{
"name":"NotePad"
}
}
]
}
}
]
}
在search template中使用嵌套字段作为参数
POST /multi_test/_msearch/template
{}
{ "source" : "{ \"query\": { \"match\": { \"name\" : \"{{person.name}}\" } } } }", "params": { "person":{"name": "google"} } }
搜索结果如下
{
"responses":[
{
"took":3,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":1,
"max_score":0.2876821,
"hits":[
{
"_index":"multi_test",
"_type":"_doc",
"_id":"1",
"_score":0.2876821,
"_source":{
"name":"Google Chrome"
}
}
]
}
}
]
}
elasticsearch之单请求多查询的更多相关文章
- 第2部分 Elasticsearch查询-请求体查询、排序
一.请求体查询 请求体 search API, 之所以称之为请求体查询(Full-Body Search),因为大部分参数是通过http请求体而非查询字符串来传递的. 请求体查询:不仅可以处理自身的查 ...
- elasticsearch 基础 —— 请求体查询
请求体查询 简易 查询 -query-string search- 对于用命令行进行即席查询(ad-hoc)是非常有用的. 然而,为了充分利用查询的强大功能,你应该使用 请求体 search API, ...
- Django之--POST方法处理表单请求
上一篇:Django之--MVC的Model 演示了如何使用GET方法处理表单请求,本文讲述直接在当前页面返回结果,并使用更常用的POST方法处理. 一.首先我们修改下page.html <!D ...
- Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)
一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...
- java如何区分是form表单请求,还是ajax请求
requestType = request.getHeader("X-Requested-With"); if(requestType==null) ...
- WebApi系列~基于单请求封装多请求的设计
回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...
- ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...
- SharePoint 2007 单列表模糊查询SPD定制
应用场景:项目中总会遇到一些列表,存着是用户.项目等数据,而我们需要查询有哪些项目,这时候,就需要用到模糊查询了,而这样的查询,基本不需要跨列表,所以,也没必要配置复杂的搜索,用Designer(简称 ...
- FeignClient调用POST请求时查询参数被丢失的情况分析与处理
前言 本文没有详细介绍 FeignClient 的知识点,网上有很多优秀的文章介绍了 FeignCient 的知识点,在这里本人就不重复了,只是专注在这个问题点上. 查询参数丢失场景 业务描述: 业务 ...
- Laravel 更新数据时在表单请求验证中排除自己,检查指定字段唯一性
原文地址:https://moell.cn/article/24 不错的laravel网站 需求场景 修改用户信息时,在表单请求验证中排除当前邮箱所在的记录行,并检查邮箱的唯一性. Laravel版本 ...
随机推荐
- linux 自动备份mysql数据库
今天一早打开服务器.13W个木马.被爆破成功2次,漏洞3个.数据库被删.这是个悲伤的经历 还好之前有备份,服务器也升级了安全机制,只是备份是上个月的备份.所以想写个脚本,试试自动备份数据库. 1. 先 ...
- 2、第二种传输数据的形式:使用ajax传输数据,将前台的数据传输到后端
第一种使用form表单中的action形式传输数据:https://blog.csdn.net/weixin_43304253/article/details/120335282 前端页面 <% ...
- 为了讲明白继承和super、this关键字,群主发了20块钱群红包
摘要:以群主发红包为例,带你深入了解继承和super.this关键字. 本文分享自华为云社区<群主发红包带你深入了解继承和super.this关键字>,作者:共饮一杯无 . 需求 群主发随 ...
- 齐博X1-新建一个空模板并在后台选择
本节实际操作建立一个空模板,并且让后台识别,选择该风格 先在index_style中建立一个目录,命名mystyle并上传我们在mystyle目录中建立一个info.php文件,代码如下:上传后,后台 ...
- 6.pygame-搭建主程序
职责明确 新建plane_main.py 封装主游戏类 创建游戏对象 启动游戏 新建plane_sprites.py 封装游戏中所有需要使用的精灵子类 提供游戏的相关工具 #plane_sprit ...
- C#--String.Substring方法
第一种:String.SubString(int start,int length) 截取指定长度的字符串 这里有两个int型的参数 string表示字符串截取的起始位置,length表截取的 ...
- Golang 和 Python 随机生成N位字符串
Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...
- Java 19 新功能介绍
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 19 在2022 年 9 ...
- SketchUp2020免费中文完整版官网2021教程模型库下载
SketchUp2022 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载SU22_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,然后找到SketchUpPr ...
- hwlog--utils.go
// Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package hwlog provides the ...