- 浏览: 2146911 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式。
(一)更新文档
(1)部分更新:
java api:
```` ` HashMap<String,Object> data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.execute().actionGet(); System.out.println("update ok......"); ````
注意部分更新功能,前提是索引和该条数据已经存在,否则会抛出对应的异常,只要任何一个不满足,都会更新失败。
curl:
```` curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" } } ````
(2)使用detect_noop
java api:
```` ` HashMap<String,Object> data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.setDetectNoop(false);//默认是true urb.execute().actionGet(); System.out.println("update ok......"); ````
curl方式:
```` curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" }, "detect_noop": false }' ````注意detect_noop的意思:
默认情况下detect_noop=true
默认情况下只有原来的source和新的source存在不同的字段情况下才会重建索引,如果一模一样是不会触发重建索引的,如果将detect_noop=false不管内容有没有变化都会重建索引,这一点可以通过version的值的变化来发现
更新的文档,必须提前存在,除非你用upset+script来更新,否则会报document
missing异常
(二)script + upset更新方式:
java api
```` ` HashMap<String,Object> params=new HashMap<>(); HashMap<String,Object> data=new HashMap<>(); data.put("name","12345"); params.put("source",data); StringBuffer sb_json = new StringBuffer("ctx._source=source"); Script script = new Script(sb_json.toString(), ScriptService.ScriptType.INLINE, "groovy", params); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-11", "active", "16"); urb.setScript(script); urb.setUpsert(data); urb.execute().actionGet(); System.out.println("更新完事。。。。。。 "); ````
curl
```` curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "script" : { "inline": "ctx._source.counter += count", "params" : { "count" : 4 } }, "upsert" : { "counter" : 1 } }' ````
(三):scripted_upsert用法:
官网个的例子没有跑通,下面这个是按照stackoverflow上面的例子改写的,可以通过
在postman里面已经跑通:
首先是在post请求的url
java api:
```` ` HashMap<String,Object> params=new HashMap<>(); HashMap<String,Object> data=new HashMap<>(); data.put("name","12345"); HashMap<String,Object> newdata=new HashMap<>(); newdata.put("name","789"); params.put("data",data); params.put("newdata",newdata); StringBuffer sb_json = new StringBuffer("if (ctx.op == \"create\") ctx._source=data; else ctx._source=newdata"); Script script = new Script(sb_json.toString(), ScriptService.ScriptType.INLINE, "groovy", params); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-11", "active", "16"); urb.setScript(script); urb.setScriptedUpsert(true); urb.setUpsert("{}");//必须有这个值,否则会报document missing exception urb.execute().actionGet(); System.out.println("更新完事。。。。。。 "); ````
curl方式
```` http://192.168.201.5:9200/active2018-03-11/active/11/_update ````
然后是下面的body里面选择raw然类型是JSON(application/json):
```` { "scripted_upsert":true, "script" : { "script":"if (ctx.op == \"create\") ctx._source=data; else ctx._source=newdata ", "params" : { "data":{ "ct":11, "aid":"a22", "tid":"t11" }, "newdata":{ "ct":1000, "aid":"a2qq2", "tid":"qq" } } }, "upsert" : {} } ````执行上面的脚本,首先会检查索引是否存在,如果不存在就会新建一个索引,然后会判断id等于11这条数据存在不存在,如果不存在就把data里面的数据作为第一次的插入数据,如果已经存在就会把原来的数据删除掉然后把newdata的数据插入进去,可以理解就是更新。这里需要注意,如果用的是动态mapping,需要注意数据的类型,动态mapping下两条数据里面的同一个字段可以拥有不同的类型,这样既灵活又带来了风险,所以对于严谨类型的数据推荐使用静态mapping,严格限定字段的类型。
(四)doc_as_upsert方式:
这个方式其实就是前面两个的简洁版,意思就是没有就插入有就覆盖,注意这是是覆盖并不是把原来的删除在插入,而且如果是动态mapping还可以改变字段的类型,但不建议这么用。
java api:
```` ` HashMap<String,Object> data=new HashMap<>(); data.put("name","234"); data.put("age",123); data.put("address","北京海淀区"); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-11", "active", "16"); urb.setDoc(data); urb.setDocAsUpsert(true); urb.execute().actionGet();// System.out.println("操作成功......"); ````
curl方式:
```` http://192.168.201.5:9200/active2018-03-11/active/12/_update { "doc" : { "name" : "6755", "age":12, "address":"北京朝阳" }, "doc_as_upsert" : true } ````
总结:
上面更新操作es几种方法,总体来说使用script更新的方式最强大,可以做一些复杂业务场景的操作,如数值的累增或者操作集合对象元素的追加或者删除,其他的几种方式适合简单的更新操作。
不管使用那种更新方式,我们都需要考虑并发问题,通过前面一系列的文章的介绍,我们知道es里面的更新,删除,都是伪操作,尤其是更新,在es内部的实际处理流程是:
(1)查询旧的document数据
(2)修改成最新的数据
(3)然后重建整条document
在这里的三个阶段,如果同时又另外一个进程也在修改该条数据,就会发生冲突,es里面是根据version字段来判断是否冲突的,在上面的步骤中的第一步查询旧的数据会得到version字段,在第三步时候写的时候会把这个version字段在传回,这个时候如果发现version不一致就会发生冲突然后抛出异常,所以大家在使用的时候可以优先通过设计避免多线程操作,如果实在没法避免则可以使用es里面的提供的version字段来通过乐观锁控制并发问题,如果操作是简单的累加或累减还可以用更简单的方法冲突重试来解决并发问题,一句话就是具体场景具体分析,关于es并发问题后面有空可以单独再整理一篇文章出来。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
发表评论
-
复盘一个Elasticsearch排序问题的剖析
2019-07-15 21:12 995最近线上的es查询的 ... -
elasticsearch里面bulk的用法
2018-04-09 20:23 1390上篇文章介绍了在es里 ... -
elasticsearch里面的关于批量读取mget的用法
2018-04-04 16:01 1801es的api除了提供了基本 ... -
elasticsearch的查询流程分析
2018-04-02 20:29 1277我们都知道es是一个分 ... -
如何在elasticsearch里面使用深度分页功能
2018-03-28 18:13 1957前面的文章提到过es默认的from+size的分页方式返回的结 ... -
如何在Elasticsearch里面使用索引别名
2018-03-27 20:37 1632在elasticsearch里面给index起一个alias ... -
如何优雅的全量读取Elasticsearch索引里面的数据
2018-03-26 20:27 7607### (一)scroll的介绍 有时候我们可能想要读取整个 ... -
Elasticsearch里面的segment合并
2018-03-20 17:50 2048通过前面的文章,我 ... -
Elasticsearch如何保证数据不丢失?
2018-03-19 20:52 2086上篇文章提到过,在elasticsearch和磁盘之间还有一层 ... -
为什么说Elasticsearch搜索是近实时的?
2018-03-16 19:41 9361通过前面两篇文章的介绍,我们大概已经知道了 Elasticse ... -
Elasticsearch如何动态维护一个不可变的倒排索引
2018-03-15 21:34 1090上一篇文章中介绍了Elasticsearch中是如何搜索文本 ... -
Elasticsearch如何检索数据
2018-03-14 20:11 980我们都知道Elasticsearch是一个全文检索引擎,那么它 ... -
如何备份ElasticSearch索引数据到HDFS上
2018-02-09 18:19 2355在ElasticSearch里面备份策略已经比较成熟了 ... -
Elasticsearch5.6.4集群搭建
2018-02-07 20:13 1293本次搭建的是一个三节点的集群 (一)es的安装 (1)下 ... -
如何使log4j生成json格式的log
2017-09-15 17:44 3773使用java开发项目时,log日志一般都是应用程序必不可少的一 ... -
理解elasticsearch的parent-child关系
2017-09-04 18:43 2784前面文章介绍了,在es里面的几种数据组织关系,包括array ... -
简述ElasticSearch里面复杂关系数据的存储方式
2017-08-18 20:10 2361在传统的数据库里面,对数据关系描述无外乎三种,一对一,一对多和 ... -
使用Java Rest Client操作Elasticsearch
2017-08-09 19:42 2209Elasticsearch作为一个成熟的开源框架,对主流的多种 ... -
ElasticSearch里面的偏好查询
2017-06-22 17:17 1252在es查询的时候我们可 ... -
ElasticSearch里面的路由功能介绍
2017-06-21 18:17 2208在ElaticSearch里面,路由 ...
相关推荐
(2)包含市面上几乎没有的所有Elasticsearch高级知识点:包含地理位置搜索与聚合分析,term vector,suggester search,搜索模板定制,query执行剖析,数十种最全面的聚合分析,span query,shard分配定制,es插件...
对于Elasticsearch,如果要在项目中使用,第一个要解决的问题就是,如何将数据库中的数据同步到Elasticsearch,下面常见的几种中方案 修改代码,修改插入数据库的代码,同时插入Elasticsearch 修改代码,修改插入...
Elasticsearch数据格式插件提供了一项功能,使您可以将搜索结果的响应下载为JSON以外的其他几种格式。 支持的格式为CSV,Excel,JSON(批量),JSON(对象列表)和GeoJSON。 版 问题/问题 请提出。 安装 $ $ES_HOME/...
基于Spring Boot2.5+ Spring Data ElasticSearch4.2环境搭建的 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、...
数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫...
还有许 多其他工具,但 Elasticsearch 更受欢迎,因为它易于安装,扩展到数百个节点,没有额外的软件,并且 由于其内置的 REST API 而易于使用。 物联网领域最专业的智能终端与解决方案供应商及信息服务商 [广州捷宝...
数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫...
最新华证ESG2009-2023年总体评级数据 2009年第1季度-2023年第 4季度 沪深A股 数据来源于WIND数据库 压缩包一共4个文件: ...所以WIND数据库中更新后的2009-2023年华证ESG评级数据没有AAA级的 了。基于新的评分
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
有时候我们即使搭建好了ES集群,但数据存进去后到底是以一个什么形态存在,我们可能也疑惑重重,此时要是有个可视化的管理工具来辅助一下就便易于理解了,因此本文就搜罗了几种 Elasticsearch可视化管理工具并一一...
数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫...
在本节中,我们将介绍为什么您可能要使用Chewy而不是Official elasticsearch-ruby客户gem。 多模型索引。 索引类独立于ORM / ODM模型。 现在,实现跨模型自动完成功能变得更加容易。 您可以只定义索引并以面向...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
Mining:在大量数据中自动搜索隐藏于其中的有着特殊关系性(属于Association rule learning)的信息的过程。相比商务智能,数据挖掘是一种更加学术的说法,强调技术和方法。 OLAP:是一个建立数据系统的方法,其核心...
。...具备大屏设计、预览能力,支持MySQL、Oracle、PostgreSQL、SQLServer、ElasticSearch、JSON、JS、HTTP、Groovy等数据集接入,使用简单,完全免费,代码开源。
有几种可用的算法: 使用GluonTS工具包的DeepAR算法 ARIMA和SARIMA使用金字塔自动Arima 这将与cron作业定期执行。 取决于您的实现,生产中应将其保留在其他机器上,因为对DeepAR的计算要求很高,并且与数据大小...
配置繁琐,对外暴露监控端口有数据 Logstash 是 Elastic.co 旗下的一个开源数据收集引擎,可动态的统一不同的数据源的数据至目的地,搭配 ElasticSearch 进行分析,Kibana 进行页面展示,是著名的 ELK 技术栈中的「...
介绍这是一些示例集合,可帮助...图探索入门弹性堆栈上的警报警报使您可以设置监视(或规则)以检测和警告Elasticsearch数据中的更改。 以下是示例手表的列表,这些手表配置为在一些常见情况下进行检测和发出警报:机器