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版本 ...
随机推荐
- [Err] 1052 - Column ‘roleId‘ in where clause is ambiguous
1.先看错误的sql语句: select a.authName from roles as r,authority as a,role_ah as ra where ra.roleId=r.roleI ...
- LcdTools如何编写MIPI指令(初始化代码)
在LcdTools帮助文档中查看MIPI读写指令描述,如下图 编写LCM初始化代码就是配置LCM Driver IC寄存器值,一般只需用MipiWrite()指令写参数即可:下面介绍MipiWrite ...
- Cookie、Session、Token与JWT(跨域认证)
之前看到群里有人问JWT相关的内容,只记得是token的一种,去补习了一下,和很久之前发的认证方式总结的笔记放在一起发出来吧. Cookie.Session.Token与JWT(跨域认证) 什么是Co ...
- CentOS6/7 配置守护进程
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式. 一.相关命令 通过initctl help可以查看相关命令 [root@localhost ~ ...
- Sprint产品待办列表的优先级要怎么排?
在梳理产品待办事项列表的过程中,产品负责人需要先做优先级排列,保证我们 在一定的时间盒内能够交付需要优先级最高.最具价值的用户故事. 那这个用户故事的优先级要怎么排列,我们怎样选择用户故事的实现顺序? ...
- 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC
RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...
- C#11之原始字符串
最近.NET7.0和C#11相继发布,笔者也是第一时间就用上了C#11,其中C#11的有一个更新能解决困扰我多年的问题,也就是文章的标题原始字符串. 在使用C#11的原始字符串时,发现的一些有意思的东 ...
- Node.js的学习(二)node.js 模块化
一.Node.js模块化 1.模块化概要 早期的javascript版本没有块级作用域.没有类.没有包.也没有模块,这样会带来一些问题,如复用.依赖.冲突.代码组织混乱等,随着前端的膨胀,模块化显得非 ...
- 使用Python实现多线程、多进程、异步IO的socket通信
多线程实现socket通信服务器端代码 import socket import threading class MyServer(object): def __init__(self): # 初始化 ...
- hashlib加密 logging日志 subprocess
Day23 hashlib加密 logging日志 hahlib加密模块 logging日志模块 subprocess模块 1.hahlib加密模块 1.什么是加密? 将明文数据处理成密文数据的过程 ...