一、需要解决的问题

有的时候我们需要同时执行多个查询,并且需要得到每个单独查询的搜索结果,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之单请求多查询的更多相关文章

  1. 第2部分 Elasticsearch查询-请求体查询、排序

    一.请求体查询 请求体 search API, 之所以称之为请求体查询(Full-Body Search),因为大部分参数是通过http请求体而非查询字符串来传递的. 请求体查询:不仅可以处理自身的查 ...

  2. elasticsearch 基础 —— 请求体查询

    请求体查询 简易 查询 -query-string search- 对于用命令行进行即席查询(ad-hoc)是非常有用的. 然而,为了充分利用查询的强大功能,你应该使用 请求体 search API, ...

  3. Django之--POST方法处理表单请求

    上一篇:Django之--MVC的Model 演示了如何使用GET方法处理表单请求,本文讲述直接在当前页面返回结果,并使用更常用的POST方法处理. 一.首先我们修改下page.html <!D ...

  4. Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)

    一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...

  5. java如何区分是form表单请求,还是ajax请求

    requestType = request.getHeader("X-Requested-With");                 if(requestType==null) ...

  6. WebApi系列~基于单请求封装多请求的设计

    回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...

  7. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  8. SharePoint 2007 单列表模糊查询SPD定制

    应用场景:项目中总会遇到一些列表,存着是用户.项目等数据,而我们需要查询有哪些项目,这时候,就需要用到模糊查询了,而这样的查询,基本不需要跨列表,所以,也没必要配置复杂的搜索,用Designer(简称 ...

  9. FeignClient调用POST请求时查询参数被丢失的情况分析与处理

    前言 本文没有详细介绍 FeignClient 的知识点,网上有很多优秀的文章介绍了 FeignCient 的知识点,在这里本人就不重复了,只是专注在这个问题点上. 查询参数丢失场景 业务描述: 业务 ...

  10. Laravel 更新数据时在表单请求验证中排除自己,检查指定字段唯一性

    原文地址:https://moell.cn/article/24 不错的laravel网站 需求场景 修改用户信息时,在表单请求验证中排除当前邮箱所在的记录行,并检查邮箱的唯一性. Laravel版本 ...

随机推荐

  1. 关于Vue多线程的思考

    在前端调用的时候,我们难免需要同一时刻向后端请求多组数据或是总是期待着是否存在一个独立的线程去处理一系列的数据.线程相应,资源的抢占这是前端较为麻烦的点.这里就来聊聊我在前端踩的坑. 首先是线程问题说 ...

  2. 记一次 .NET 某电子病历 CPU 爆高分析

    一:背景 1.讲故事 前段时间有位朋友微信找到我,说他的程序出现了 CPU 爆高,帮忙看下程序到底出了什么情况?图就不上了,我们直接进入主题. 二:WinDbg 分析 1. CPU 真的爆高吗? 要确 ...

  3. TensorFlow搭建模型方式总结

    引言 TensorFlow提供了多种API,使得入门者和专家可以根据自己的需求选择不同的API搭建模型. 基于Keras Sequential API搭建模型 Sequential适用于线性堆叠的方式 ...

  4. 45.限流Throttling及源码解析

    什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...

  5. $_SERVER["REQUEST_URI"],在 PHP 众多预定义服务器变量中,$_SERVER["REQUEST_URI"] 算是经常用到的,但是这个变量只有 apache 才支持

    例如访问:http://localhost/index.php?app=lunbo获取到的$_SERVER["REQUEST_URI"]为"/index.php?app= ...

  6. DelCrLfSpace V0.9

    开发界面 Option Explicit 'SourceTextBox 是上面的源框 'ResultTextBox 是下面的处理预览框 'Form KeyPreview = True Private ...

  7. day05-JavaScript02

    JavaScript02 8.JavaScript函数 JavaScript函数介绍 函数是由事件驱动的,或者当它被调用时,执行的可重复使用的代码 例子 <!DOCTYPE html> & ...

  8. Java多线程-线程关键字(二)

    Java中和线程相关的关键字就两:volatile和synchronized. volatile以前用得较少,以后会用得更少(后面解释).它是一种非常轻量级的同步机制,它的三大特性是: 1.保证可见性 ...

  9. 纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码(简易版)

    theme: cyanosis 最近打火机与公主裙中的爱心代码超级火,看着特别心动,让俺用css来写个简易版!!! 先看效果: 代码拆解: 主要是分为3大部分 分子颗粒 爱心 动画 代码实现: 分子颗 ...

  10. Goland环境中Go module配置

    [现象] 从go vendor切换到go module之后,import包解析有问题.如下所示: 对应的go modules也没解析出来 [原因] 有两点原因: goland中go module配置存 ...