ElasticSearch 学习 ==ELK== 进阶

这篇具有很好参考价值的文章主要介绍了ElasticSearch 学习 ==ELK== 进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二、ElasticSearch 学习 ELK 进阶

(1)文档局部更新

我们也说过文档是不可变的——它们不能被更改,只能被替换。 update API必须遵循相同的规则。表面看来,我们似乎是局部更新了文档的位置,内部却是像我们之前说的一样简单的使用 update API处理相同的检索*-修改-*重建索引流程,我们也减少了其他进程可能导致冲突的修改。

最简单的 update 请求表单接受一个局部文档参数 doc ,它会合并到现有文档中——对象合并在一起,存在的标量字段被覆盖,新字段被添加。举个例子,我们可以使用以下请求为博客添加一个 tags 字段和一个 views 字段:

POST /website/blog/1/_update
{
    "doc" : {
        "tags" : [ "testing" ],
        "views": 0
	}
}

返回:

{
    "_index" : "website",
    "_id" : "1",
    "_type" : "blog",
    "_version" : 3
}

查询当前的文档信息:

GET /website/blog/1

{
    "_index": "website",
    "_type": "blog",
    "_id": "1",
    "_version": 3,
    "found": true,
    "_source": {
        "title": "My first blog entry",
        "text": "Starting to get the hang of this...",
        "tags": [ "testing" ], 
        "views": 0
    }
}

(2)使用脚本局部更新

使用Groovy脚本
    这时候当API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持
    非常多的API,例如搜索、排序、聚合和文档更新。脚本可以通过请求的一部分、检索特
    殊的 .scripts 索引或者从磁盘加载方式执行。
默认的脚本语言是Groovy,一个快速且功能丰富的脚本语言,语法类似于Javascript。它
在一个沙盒(sandbox)中运行,以防止恶意用户毁坏Elasticsearch或攻击服务器。
1、硬编码更新:

脚本能够使用 update API改变 _source 字段的内容,它在脚本内部以 ctx._source 表示。例如,我们可以使用脚本增加博客的 views 数量:

POST /website/blog/1/_update
{
	"script" : "ctx._source.views+=1"
}
2、软编码更新:

我们还可以使用脚本增加一个新标签到 tags 数组中。在这个例子中,我们定义了一个新标签
做为参数而不是硬编码在脚本里。这允许Elasticsearch未来可以重复利用脚本,而不是在想
要增加新标签时必须每次编译新脚本:

#添加新的tag到文档中
POST /website/blog/1/_update
{
  "script": {
    "source": "ctx._source.tags.addAll(params.new_tag)",
    "params": {
      "new_tag": ["search"]
    }
  }
}

查询结果:

GET /website/blog/1

{
  "_index" : "website",
  "_type" : "blog",
  "_id" : "1",
  "_version" : 10,
  "_seq_no" : 11,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "title" : "My first blog entry",
    "text" : "Just trying this out...3",
    "views" : 2,
    "tags" : [
      "testing",
      "search"
    ]
  }
}
3、更新可能不存在的文档

比如:

​ 我们要在Elasticsearch中存储浏览量计数器。每当有用户访问页面,我们增加这个页面的浏览量。但如果这是个新页面,我们并不确定这个计数器存在与否。当我们试图更新一个不存在的文档,更新将失败。

​ 在这种情况下,我们可以使用 upsert 参数定义文档来使其不存在时被创建,将自动创建该索引信息。

POST /website_new/pageviews/1/_update
{
  "script": {
    "source": "ctx._source.views+=1"
  },
  "upsert": {
    "views": 1
  }
}

查询自动创建的信息:

GET /website_new/pageviews/_search
{
  
}

//返回值
{
  "took" : 472,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "website_new",
        "_type" : "pageviews",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "views" : 3
        }
      }
    ]
  }
}
4、更新和冲突

​ 为了避免丢失数据, update API在检索**(retrieve)阶段检索文档的当前 _version ,然后在重建索引(reindex)阶段通过 index 请求提交。如果其他进程在检索(retrieve)和重建索引(reindex)**阶段修改了文档, _version 将不能被匹配,然后更新失败。

对于多用户的局部更新,文档被修改了并不要紧。例如,两个进程都要增加页面浏览量,增加的顺序我们并不关心——如果冲突发生,我们唯一要做的仅仅是重新尝试更新既可

这些可以通过 retry_on_conflict 参数设置重试次数来自动完成,这样 update 操作将会在发生错误前进行重试,这个值默认为0。

POST /website/pageviews/1/_update?retry_on_conflict=5
{
    "script" : "ctx._source.views+=1",
    "upsert": {
    	"views": 0
    }
}

配置参数retry_on_conflict=5代表:在错误发生前重试更新5次。这种重试方式更适合于count这种与顺序无关的操作。

5、检索多个文档

使用ElasticSearch,检索多个文档可以使用合并多个请求来避免每个请求单独的网络开销。

如果你需要从Elasticsearch中检索多个文档,相对于一个一个的检索,更快的方式是在一个请求中使用multi-get或者 mget API。

mget:

  • mget API参数是一个 docs 数组,数组的每个节点定义一个文档的 _index 、 _type 、 _id 元数据。但是如果你只想检索一个或者几个确定的字段,也可以使用 _source参数进行设置;
//比如已下操作则是查询两个index的信息整合在一起返回
POST /_mget
{
  "docs": [
    {
      "_index": "website",
      "_type": "blog",
      "_id": 2
    },
    {
      "_index": "website_new",
      "_type": "pageviews",
      "_id": 1,
      "_source": "views"
    }
  ]
}
//返回结果是:
{
  "docs" : [
    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "2",
      "_version" : 10,
      "_seq_no" : 5,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "title" : "My first external blog entry",
        "text" : "This is a piece of cake..."
      }
    },
    {
      "_index" : "website_new",
      "_type" : "pageviews",
      "_id" : "1",
      "_version" : 3,
      "_seq_no" : 2,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "views" : 3
      }
    }
  ]
}
//也会通过docs组成数组的方式返回

如果想检索的在同一个_index中,可以直接使用ids的方式进行检索:

POST /website/blog/_mget
{
  "ids":["2","1"]
}

//返回
{
  "docs" : [
    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "2",
      "_version" : 10,
      "_seq_no" : 5,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "title" : "My first external blog entry",
        "text" : "This is a piece of cake..."
      }
    },
    {
      "_index" : "website",
      "_type" : "blog",
      "_id" : "1",
      "_version" : 11,
      "_seq_no" : 12,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "title" : "My first blog entry",
        "text" : "Just trying this out...3",
        "views" : 3,
        "tags" : [
          "testing",
          "search"
        ]
      }
    }
  ]
}

我们还可以使用设置_type的方式进行检索:

POST /website_new/bolg/_mget
{
  "docs":[
      {
        "_id":2
      },
      {
        "_type":"pageviews",
        "_id":1
      }
    ]
}

//返回
{
  "docs" : [
    {
      "_index" : "website_new",
      "_type" : "bolg",
      "_id" : "2",
      "found" : false
    },
    {
      "_index" : "website_new",
      "_type" : "pageviews",
      "_id" : "1",
      "_version" : 3,
      "_seq_no" : 2,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "views" : 3
      }
    }
  ]
}

可以发现,在website_new index的bolg 类型下没有id为2的数据,所以返回值found为false,所以再使用_mget的时候需要检查found是否为false。

6、批量操作

就像 mget 允许我们一次性检索多个文档一样, bulk API允许我们使用单一请求来实现多个文档的 create 、 index 、 update 或 delete 。

也就是说,我们可以铜bulk API的方式使用一个请求完成create、index、update、delete一系列的操作。这对索引类似于日志活动这样的数据流非常有用,它们可以 以成百上千的数据为一个批次按序进行索引。

bulk 请求体如下:

{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
...

这种格式类似于用 “\n” 符号连接起来的一行一行的JSON文档流**(stream)**。两个重要的点需注意:

  • 每行必须以 “\n” 符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。
  • 每一行的数据不能包含未被转义的换行符,它们会干扰分析——这意味着JSON不能被美化打印。

将这些放在一起, bulk 请求表单是这样的:

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" :
{ "doc" : {"title" : "My updated blog post"} }

通过bulk api操作,Elasticsearch响应包含一个 items 数组,它罗列了每一个请求的结果,结果的顺序与我们请求的顺序相同:

{
    "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
            }
        }
    ]
}

但是在使用批量请求的时候,需要注意一点的是:

  • 整个批量请求需要被加载到我们请求节点的内存里面,请求越大,那么给其他请求使用的内存空间就越小。

  • 有一个最佳的 bulk 请求大小。超过这个大小,性能不再提升而且可能降低,这个最佳的大小与当前的硬件、网络环境、和搜索的复杂度有关。

  • 通常可以试着使用线性增长的方式进行寻找这个平衡点,弱随着大小的增长,当性能开始降低,说明你每个批次的大小太大了。开始的数量可以在1000 ~ 5000个文档之间,如果你的文档非常大,可以使用较小的批次,通常着眼于你请求批次的物理大小是非常有用的。一千个1kB的文档和一千个1MB的文档大不相同。一个好的批次最好保持在5 ~15MB大小间。文章来源地址https://www.toymoban.com/news/detail-448208.html

到了这里,关于ElasticSearch 学习 ==ELK== 进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ELK 企业级日志分析系统的概念、ELK Elasticsearch 集群部署

    1、ELK 简介 ELK平台是一套完整的日志集中处理解决方案,将 ==ElasticSearch、Logstash 和 Kiabana ==三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch 是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。 E

    2024年02月16日
    浏览(51)
  • ELK(ElasticSearch, Logstash, Kibana)

    ELK简介 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。 Elasticsearch是个开源分布式搜

    2023年04月09日
    浏览(51)
  • ELK入门(一)-Elasticsearch(docker版)

    Elasticsearch安装(docker) 下载Elasticsearch 查询镜像 拉取镜像 docker pull elasticsearch:版本号 · 挂载配置 创建挂载文件夹 修改文件夹权限 elasticsearch.yml 在config文件夹下创建elasticsearch.yml文件,并修改其为可读写执行权限。 修改elasticsearch.yml的内容 xpack.security.enabled: 配置es的安全,但是

    2024年02月21日
    浏览(50)
  • Elasticsearch Windows部署-ELK技术栈

    本文不介绍ELK相关原理知识,只记录部署操作过程 下载地址Past Releases of Elastic Stack Software | Elastic 选择同一版本,这里选择是当前最新版本8.11.3 解压放在同目录下,方便后续操作与使用 由于8.11.3使用自带jdk,这里可以不用安装jdk并配置,低版本需要电脑中安装jdk 设置一下配

    2024年01月17日
    浏览(38)
  • ELK日志分析--ES(Elasticsearch)--(一)

    Elasticsearch:存储、搜索和分析 Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎。Logstash和Beats有助于收集,聚合和丰富你的数据并将其存储在Elasticsearch中。使用Kibana,你可以交互式地探索,可视化和共享对数据的见解,并管理和监视堆栈。Elasticsearch是发生索引,搜索和分

    2024年02月02日
    浏览(51)
  • 6.ELK之Elasticsearch嵌套(Nested)类型

    在Elasticsearch实际应用中经常会遇到嵌套文档的情况,而且会有“对象数组彼此独立地进行索引和查询的诉求”。在ES中这种嵌套文档称为父子文档,父子文档“彼此独立地进行查询”至少有以下两种方式: 1)父子文档。在ES的5.x版本中通过parent-child父子type实现,即一个索引

    2024年02月03日
    浏览(57)
  • ELK(elasticsearch+logstash+kibana+beats)

    Elasticsearch :Elasticsearch(以下简称ES) 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 ES是 Elastic Stack 的核心,采用集中式数据存储,可以通过机器学习来发现潜在问题。ES能够执行及合并多种类型的搜索(结构化数据、非结构化数据、地

    2024年02月16日
    浏览(54)
  • ELK之从Logstash读取数据到Elasticsearch

    前置条件: Elasticsearch 集群正常 Elasticsearch集群配置直通车:ELK之Elasticsearch7.17.4安装(yum方式)和三节点集群配置 Filebeat和logstash打通 ELK之LogStash接收Filebeat的数据:ELK之LogStash接收Filebeat的数据 修改Logstash 配置文件,将output改为如下地址,注释掉控制台输出,添加elasticsearc

    2024年01月22日
    浏览(46)
  • 【elasticSearch系】3.完整搭建详尽版elk

    话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 可以查看之前我搭建elasticsearch和kibana 的这篇文章 为了和之前我搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址  点击下载,这里为了方便学习我们还是下载的windows的版本 解压后,我们启动

    2024年02月11日
    浏览(29)
  • Filebeat+Kafka+ELK日志采集(五)——Elasticsearch

    1、下载 2、解压: 3、配置 启动Elasticsearch,进入/bin目录下 ./elasticsearch ,不出意外的外会报以下错误: 报错1:能打开的文件或进程数太低。 解决方法: 修改/etc/security/limits.conf 配置文件,添加配置如下: 报错2: 解决方法: 修改/etc/sysctl.conf 配置文件,添加配置如下: 修

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包