`

ElasticSearch 快速请求

阅读更多
绑定多个请求在一个请求里,可以避免处理每个请求带来的网络负载问题。
(这个技术算不上NB吧,基本都支持了。)
如果你知道你需要检索多个文档,一次请求的速度很快,而不是一个接着一个文档获取。
 
mget API 期望一组docs,每个元素包含_index,_type,_id元数据
你也可以指定_source参数来过滤字段。
 
GET /_mget
{
   "docs" : [
      {
         "_index" : "website",
         "_type" "blog",
         "_id" :    2
      },
      {
         "_index" : "website",
         "_type" "pageviews",
         "_id" :    1,
         "_source": "views"
      }
   ]
}
 
响应体也包含一组docs.按照请求对应的顺序返回。
每个响应
 
{
   "docs" : [
      {
         "_index" :   "website",
         "_id" :      "2",
         "_type" :    "blog",
         "found" :    true,
         "_source" : {
            "text" "This is a piece of cake...",
            "title" : "My first external blog entry"
         },
         "_version" : 10
      },
      {
         "_index" :   "website",
         "_id" :      "1",
         "_type" :    "pageviews",
         "found" :    true,
         "_version" : 2,
         "_source" : {
            "views" : 2
         }
      }
   ]
}
 
如果你检索的文档都在同一个index里(甚至同一个type),
你可以指定/_index或者/_index/_type在url里。
 
你也可以覆盖这些值。
 
GET /website/blog/_mget
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "pageviews", "_id" :   1 }
   ]
}
 
事实上,如果所有的文档有同样的_index,_type,
 
你可以这样来查询:
GET /website/blog/_mget
{
   "ids" : [ "2", "1" ]
}
 
注意:第二个文档不存在,
如果不存在
 
{
  "docs" : [
    {
      "_index" :   "website",
      "_type" :    "blog",
      "_id" :      "2",
      "_version" : 10,
      "found" :    true,
      "_source" : {
        "title":   "My first external blog entry",
        "text":    "This is a piece of cake..."
      }
    },
    {
      "_index" :   "website",
      "_type" :    "blog",
      "_id" :      "1",
      "found" :    false 
    }
  ]
}
 
文档没有找到。
第二个文档没找到,不影响第一个,每个文档独立执行。
 
HTTP响应体的代码是200,尽管有一个文档没找到,
事实上,就算都没找到,也还是200,
原因是mget本身已经成功执行了,
用户需要关注found字段的值。
http://my.oschina.net/qiangzigege/blog/264370
 
 
 
 
 
 
 
 
mget让我们一次检索多个文档
bulk API让我们来做多个创建,索引,更新和删除请求。
这个非常有用。
 
bulk请求体有如下的格式:
 
{ action: { metadata }}\n
{ request body        }\n
{ action: { metadata }}\n
{ request body        }\n
...
 
需要注意两点:
1 每行要以'\n'结束,最后一行也是,
2 不能包含非转义换行符,影响解析。
action/metadata指定对文档执行什么操作。
 
action是以下几种之一:index,create,update,delete.
metadata指定_index,_type,_id来让文档被索引,创建,更新和删除。
 
比如,一个删除的请求如下:
 
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
请求体包含了文档_source本身,文档包含的字段和值,
当行为为index和create时要求存在,你必须提供文档来索引。
 
 
行为为update时,也需要,比如doc,upsert,script等等。
删除则不需要request body.
 
{ "create":  { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
如果没有指定id,自动生成一个id.
 
{ "index": { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
 
看一个例子。
 
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
VIEW IN SENSE
 
响应如下:
{
   "took": 4,
   "errors": false,
   "items": [
      "delete": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 2,
            "status":   200,
            "found":    true
      }},
      "create": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 3,
            "status":   201
      }},
      "create": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "EiwfApScQiiy7TIKFxRCTw",
            "_version": 1,
            "status":   201
      }},
      "update": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 4,
            "status":   200
      }}
   ]
}}
 
~~~~~~~~~~~~~~~~~~
 
每个子请求都独立执行,所以一个失败不会影响别人,
如果任何一个请求失败,顶层的失败标识被设置为true,
错误细节会被报告。
 
 
 
POST /_bulk
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "Cannot create - it already exists" }
{ "index":  { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "But we can update it" }
 
响应体里可以看到:
创建123失败,因为已经存在,但是后续的请求成功了。
 
{
   "took": 3,
   "errors": true,
   "items": [
      "create": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "status":   409,
            "error":    "DocumentAlreadyExistsException
                        [[website][4] [blog][123]:
                        document already exists]"
      }},
      "index": {
            "_index":   "website",
            "_type":    "blog",
            "_id":      "123",
            "_version": 5,
            "status":   200
      }}
   ]
}
 
这也意味着,批量请求不是原子的,不能用来实现事务。
 
每个请求独立处理,
 
 
不要重复自己
也许你在批量索引日志数据到同一个index里,同一个type,
为每个文档指定元数据是一种浪费,正如mget api所示,
bulk请求接受/_index和/_index/_type在url里。
 
POST /website/_bulk
{ "index": { "_type": "log" }}
{ "event": "User logged in" }
 
你也仍然可以覆盖_index和_type在metadata行里。
但是它默认使用url里的值。
 
 
POST /website/log/_bulk
{ "index": {}}
{ "event": "User logged in" }
{ "index": { "_type": "blog" }}
{ "title": "Overriding the default type" }
 
多大是多大?
整个bulk请求需要被接受到请求的节点放在内存里,所以请求的数据越多,
其它请求可用的内存数量越少,有一个最佳大小,
超过那个大小,性能不会提高甚至下降。
 
这个最佳大小,尽管如此,不是一个固定数字,取决于你的硬件,文档大小和复杂度。
你的索引和查找负载,幸运的,很容易找到这个点。
 
尝试批量索引典型的文档,大小不断增加,当性能开始下降,说明这个数字太大了。
可以取一个[1000,5000]之间的数字作为开始。
 
同样也要关注你的请求的物理大小,10001kb的文档是不同于10001M的文档的。
一个比较好的bulk大小是5-15MB大小。
http://my.oschina.net/qiangzigege/blog/264382
 
 
 
 
 
 
 
 
 
 
 
 
 
分享到:
评论

相关推荐

    ElasticSearch-head插件

    Elasticsearch-head插件是一个基于Grunt(JavaScript任务运行器)开发的Web应用,它提供了一个简洁、直观的用户界面,使用户能够轻松地查看集群状态、索引信息、文档数据以及执行RESTful请求。这个插件的设计理念是...

    linux命令行elasticsearch查询工具es2unix

    通过熟练掌握es2unix以及与其配合使用的Unix命令,你可以轻松实现对Elasticsearch中的大数据进行快速分析和操作,这对于日常运维和数据分析工作来说是非常有价值的。因此,学习并掌握es2unix对于Linux环境下的...

    ES同义词插件 elasticsearch-analysis-dynamic-synonym-6.5.1.rar

    在IT领域,尤其是在搜索引擎优化和大数据分析中,Elasticsearch(ES)是一个广泛使用的开源全文检索引擎。它基于Lucene库,提供了分布式、实时、高可用性以及容错能力的数据存储和搜索解决方案。本篇文章将重点讲解...

    elasticsearch-head插件

    Elasticsearch-Head 是一款专为谷歌Chrome浏览器设计的开源插件,主要用于方便地管理和查看Elasticsearch(ES)集群的状态和数据。这款插件提供了一个直观的图形用户界面(GUI),使得用户无需编写复杂的查询语句,...

    最新版windows elasticsearch-7.15.2-windows-x86_64.zip

    Elasticsearch具有分布式、实时、支持多租户的特点,这意味着它可以处理大量数据,并能快速响应用户的查询请求。 7.15.2版本是Elasticsearch的一个稳定版本,它可能包含了性能优化、新的特性和错误修复。在这一版本...

    Elasticsearch权威指南高清中文版PDF

    - **倒排索引**:Elasticsearch使用倒排索引来快速执行全文搜索。 - **自动分词**:内置分词器处理多种语言的文本,实现精准的全文检索。 2. **安装与配置** - **安装步骤**:讲解如何在不同的操作系统上安装...

    elasticsearch-7.17.5-windows-x86_64.zip

    Elasticsearch,作为一款强大的基于Lucene的搜索服务器,它在现代数据检索和分析领域扮演着至关重要的角色。这个“elasticsearch-7.17.5-windows-x86_64.zip”文件是Elasticsearch的7.17.5版本,专为Windows x86_64...

    最新版windows elasticsearch-8.3.0-windows-x86_64.zip

    Elasticsearch 8.3.0 是一个高度可扩展、高性能的开源全文搜索引擎,尤其在大数据分析和实时搜索领域有着广泛的应用。这个版本是专为Windows 64位操作系统设计的,确保在Windows环境下能够充分利用多核处理器的优势...

    JAVA使用ElasticSearch查询in和not in的实现方式

    JAVA使用ElasticSearch查询in和not in的实现方式 Elasticsearch是一个基于Lucene的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。它是用Java开发的,并作为Apache许可条款下的开放...

    IK分词器elasticsearch-analysis-ik-7.17.16

    Elasticsearch在与远程节点交互或执行HTTP请求时会用到它。 2. **httpcore-4.4.4.jar**:HttpClient的核心组件,提供了HTTP协议的基本实现。 3. **commons-codec-1.9.jar**:Apache Commons Codec库,提供了各种编码...

    elasticsearch-6.8.1.tar.gz

    **Elasticsearch 6.8.1:一个强大的开源分布式搜索引擎** Elasticsearch,作为一款全球广泛应用的开源搜索引擎,以其高效、可扩展和实时的特性赢得了广大开发者的喜爱。6.8.1版本是Elasticsearch的一个重要里程碑,...

    最新版windows elasticsearch-7.8.0-windows-x86_64.zip

    Elasticsearch是一个开源的全文搜索引擎,它以分布式、RESTful API接口、实时、高可用性和可扩展性而闻名。在Windows环境下安装和使用Elasticsearch 7.8.0版本,用户可以享受到强大的搜索和分析功能,适用于日志分析...

    Elasticsearch入门学习笔记

    Elasticsearch 是一款功能强大的开源全文搜索引擎,常用于大数据分析和实时检索场景。这篇入门学习笔记将引导初学者了解如何安装、配置以及使用Elasticsearch。 首先,让我们从安装开始。要安装Elasticsearch,你...

    elasticsearch-6.8.5.zip

    这种快速的索引和搜索能力使得 Elasticsearch 在实时分析和日志聚合场景中表现突出。 作为分布式系统,Elasticsearch 可以轻松地在多台机器上运行,提供高可用性和容错性。节点之间的数据复制和负载均衡使得系统在...

    Elasticsearch实现检索词自动补全(检索词补全,自动纠错,拼音补全,繁简转换) 包含demo

    Elasticsearch 分析器插件 `elasticsearch-analysis-pinyin` 正是为此设计的,它将中文字符转换为拼音,使得用户可以输入拼音进行搜索,同时也能返回包含这些拼音的文档。在提供的 `elasticsearch-analysis-pinyin-...

    基于Java8的SSM+Elasticsearch全文检索的个人博客系统.zip

    在博客系统中,Elasticsearch可以存储和索引博客文章内容,以便快速地进行关键词搜索。 整合SSM与Elasticsearch的关键步骤包括: 1. **配置Elasticsearch**:在项目中引入Elasticsearch的Java客户端依赖,并配置...

    最完整的Elasticsearch 基础教程

    本教程将深入浅出地介绍Elasticsearch的基础知识,帮助初学者快速上手。 1. **Elasticsearch 概述** - Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和数据分析引擎。 - 它的核心特性包括实时性...

Global site tag (gtag.js) - Google Analytics