《深入理解ElasticSearch》——2.4 批量操作

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第2章,第2.4节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 批量操作

在本书的几个范例中,我们使用了批量索引格式携带数据,这种方式允许我们高效地发送数据至ElasticSearch。ElasticSearch提供了批量操作功能来读取数据和检索。值得一提的是,这些操作与批量索引类似,允许用户将多个请求归到一组,尽管每个请求可能有各自的目标索引和类型。现在,让我们看看都有哪些批量操作功能。
2.4.1 批量取
批量取(MultiGet)可以通过_mget端点(endpoint)操作,它允许使用一个请求获取多个文档。与实时获取功能类似,文档获取也是实时的,ElasticSearch会返回那些被索引的文档,而不论这些文档可用于搜索还是暂时对查询不可见。请查看下面的操作:


《深入理解ElasticSearch》——2.4 批量操作

该操作获取了两个特定的文档,其中索引名和类型在URL中定义。同时在前面的范例中,我们也设置了要获取的字段名(通过使用字段请求参数,即request参数)。ElasticSearch返回了如下形式的文档集:

《深入理解ElasticSearch》——2.4 批量操作

前面的范例也可以写成这种更紧凑的形式:

《深入理解ElasticSearch》——2.4 批量操作https://yqfile.alicdn.com/e7b14197e7735946edb8e8b7421706d994bee8cb.png" >

这种形式更便于批量获取具有如下特点的文档集:不同文档有不同的目标索引及类型,或者不同文档返回的字段组合不同。在当前范例中,URL中包含的信息被看作默认值。例如,我们查看下面这个查询:

《深入理解ElasticSearch》——2.4 批量操作https://yqfile.alicdn.com/33e5940762f7097204233393503c5a6130db377b.png" >

该查询返回了ID为1跟3的两个文档,但是第一个文档从索引library_backup中获取,而第二个文档则从索引library中获取(因为URL中定义的索引名为library,因此将它作为默认值)。除此之外,在第一个文档中,我们限制只返回文档的otitle字段。
随着ElasticSearch 1.0的发布,MultiGet API允许用户设置要操作文档的版本。如果文档的版本与请求版本不一致,则ElasticSearch不会执行相应操作。另外,还有两个参数:version,该参数允许用户传递感兴趣的版本信息;version_type,拥有internal和external两个取值。
2.4.2 批量查询
与批量取类似,批量查询允许用户将多个查询请求打包到一组。不过它的分组略有不同,更像批量索引操作。ElasticSearch将输入解析成一行一行的文本,而文本行(每一对)包含了目标索引、其他参数以及查询串等信息。请查看下面这个简单的范例:

《深入理解ElasticSearch》——2.4 批量操作

正如你所见,查询请求被发送到_msearch端点。URL中的索引名及类型是可选的,并且会作为剩余输入行的默认参数。剩余行可用于存储搜索类型信息(search_type)以及查询执行的路由或提示信息(preference)。因为这些参数并不是必需的,在某些特殊情况下,行中可以包含空对象({})甚至行本身为空。请求的偶数行负责携带真正的查询。现在,让我们看看该请求的查询结果:


《深入理解ElasticSearch》——2.4 批量操作https://yqfile.alicdn.com/012846f35a1ae46b34cbcc02fbd802a33e2c95b5.png" >


《深入理解ElasticSearch》——2.4 批量操作https://yqfile.alicdn.com/add7989f1e251f9de2adf648d7ff6b0d537fea1d.png" >

返回的JSON结果包含了与批量搜索中的查询相对应的响应对象(response object)数组。如前所述,批量查询允许我们将多个独立的查询打包到一个请求中,因此,与之对应的,不同查询的返回文档可能具有不同的结构(本范例省略了)。
请记住,批量搜索就像批量索引一样,请求中不允许包含任何多余的值。每一行都有明确的用途,因此,请确保每行后面都紧随换行符,并且确保用于发送查询的工具没有对发送的数据做任何修改。这就是为什么我们在使用curl命令行时,使用了--data-binary选项而不是-d选项,因为后者并不保留换行符。