使用 Elasticsearch

了解如何创建索引,添加,删除,更新文档
参考文档 开始使用 Elasticsearch 1

本文用到Elasticsearch和Kibana 可以看之前的两篇先安装好
Elasticsearch 安装
Kibana安装

Elasticsearch 里的接口都是通过 REST 接口来实现的。

GET						读取数据
POST					插入数据
PUT 或 PATCH			更新数据,或如果是一个新的 id,则插入数据
DELETE					删除数据

http://localhost:5601/app/dev_tools
在这里插入图片描述

在这里插入图片描述

GET /

在这里插入图片描述
还可以复制为Curl
在这里插入图片描述

curl -XGET "https://1270.0.1:9200/" -H "kbn-xsrf: reporting"

同样可以 复制curl至页面就会变成 GET /
在这里插入图片描述


查看当前索引的 mapping:

GET dada/_mapping
{"dada": {"mappings": {"properties": {"cc": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"uid": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"user": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}}}
}

Elasticsearch 的数据类型:

text:							全文搜索字符串
keyword:						用于精确字符串匹配和聚合
date 及 date_nanos:				格式化为日期或数字日期的字符串
byte, short, integer, long:	整数类型
boolean:						布尔类型
float,double,half_float:		浮点数类型
分级的类型:object 及 nested。

创建一个索引 test,并且含有 id 及 message 字段。id 字段为 keyword 类型,而 message 字段为 text 类型,那么我们可以使用如下的方法来创建:

PUT test
{"mappings": {"properties": {"id": {"type": "keyword"},"message": {"type": "text"}}}
}
#--------返回结果--------
{"acknowledged": true,"shards_acknowledged": true,"index": "test"
}

追加一个新的字段 age,并且它的类型为 long 类型:

PUT test/_mapping
{"properties": {"age": {"type": "long"}}
}
#--------返回结果--------
{"acknowledged": true
}
#查看结果
GET test/_mapping
#--------返回结果--------
{"test": {"mappings": {"properties": {"age": {"type": "long"},"id": {"type": "keyword"},"message": {"type": "text"}}}}
}

_refresh用于使新文档在搜索时可见。
反过来,_flush用于在硬盘上持久化内存段。
_flush不会影响Elasticsearch中文档的可见性,因为搜索是在内存段中进行的,而_refresh会影响它们的可见性。

#存在就会修改
PUT dada/_doc/2
{"user":"222","uid":2,"cc":"222"
}
#存在就会返回报错
PUT dada/_create/2
{"user":"222","uid":2,"cc":"222"
}
#效果一样
PUT dada/_doc/2?op_type=create
{"user":"22222","uid":2,"cc":"222"
}
#--------返回报错--------
{"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[2]: version conflict, document already exists (current version [2])","index_uuid": "gFA5LQXRQIef2WBv3d_aWw","shard": "0","index": "dada"}],"type": "version_conflict_engine_exception","reason": "[2]: version conflict, document already exists (current version [2])","index_uuid": "gFA5LQXRQIef2WBv3d_aWw","shard": "0","index": "dada"},"status": 409
}

查询只看_source部分

GET dada/_doc/2
#正常返回
{"_index": "dada","_id": "2","_version": 2,"_seq_no": 6,"_primary_term": 1,"found": true,"_source": {"user": "222","uid": 2,"cc": "222"}
}
#--------_source-------
GET dada/_source/2
#返回
{"user": "222","uid": 2,"cc": "222"
}

自动 ID 生成

使用 POST

POST dada/_doc/
{"user":"55","uid":5,"cc":"55"
}
#-----返回的结果:-----
{"_index": "dada","_id": "u_g9C4kB2SZh9y2Iu2Gc","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 7,"_primary_term": 1
}

只读部分数据

GET dada/_doc/2?_source=user,uid
#-----返回的结果------
{"_index": "dada","_id": "2","_version": 2,"_seq_no": 6,"_primary_term": 1,"found": true,"_source": {"user": "222","uid": 2}
}
GET dada/_source/2?_source=user,uid
#-----返回的结果------
{"user": "222","uid": 2
}

一次请求查找多个文档 _mget

GET _mget
{"docs":[{"_index":"dada","_id":2},{"_index":"test","_id":"vPhIC4kB2SZh9y2IU2G6"}]
}
#-----------返回的结果------------
{"docs": [{"_index": "dada","_id": "2","_version": 2,"_seq_no": 6,"_primary_term": 1,"found": true,"_source": {"user": "222","uid": 2,"cc": "222"}},{"_index": "test","_id": "vPhIC4kB2SZh9y2IU2G6","_version": 1,"_seq_no": 0,"_primary_term": 1,"found": true,"_source": {"age": 20,"id": 11,"message": "lalalalaaaa"}}]
}

也可以只获得部分字段

GET _mget
{"docs":[{"_index":"dada","_id":2,"_source":["user","uid"]},{"_index":"test","_id":"vPhIC4kB2SZh9y2IU2G6"}]
}
#---------返回的结果---------
{"docs": [{"_index": "dada","_id": "2","_version": 2,"_seq_no": 6,"_primary_term": 1,"found": true,"_source": {"user": "222","uid": 2}},{"_index": "test","_id": "vPhIC4kB2SZh9y2IU2G6","_version": 1,"_seq_no": 0,"_primary_term": 1,"found": true,"_source": {"age": 20,"id": 11,"message": "lalalalaaaa"}}]
}

GET _mget
{"docs":[{"_index":"dada","_id":2,"_source":["user","uid"]},{"_index":"dada","_id":1}]
}
#--------可简写:---------
GET dada/_mget
{"ids":["1","2"]
}
#------------返回结果------------
{"docs": [{"_index": "dada","_id": "1","_version": 1,"_seq_no": 0,"_primary_term": 1,"found": true,"_source": {"user": "GB","uid": "sss","cc": "aa"}},{"_index": "dada","_id": "2","_version": 2,"_seq_no": 6,"_primary_term": 1,"found": true,"_source": {"user": "222","uid": 2,"cc": "222"}}]
}

修改一个文档

在上面我们看到了可以使用 POST 的命令来修改改一个文档。通常我们使用 POST 来创建一个新的文档。在使用 POST 的时候,我们甚至不用去指定特定的 id,系统会帮我们自动生成。但是我们修改一个文档时,我们通常会使用 PUT 来进行操作,并且,我们需要指定一个特定的 id 来进行修改:

PUT修改时,每一项都会改

PUT test/_doc/1
{"age":110,"id":1212
}

使用POST 只改需要改的字段,其他字段会保留下来

POST test/_update/1
{"doc": {"age":22222,"id":20}
}

先查询后修改 script

通过查询的方式来进行查询,让后进行修改。ES 也提供了相应的 REST 接口。

会把所有age为22222的都修改

POST test/_update_by_query
{"query": {"match": {"age": "22222"}},"script": {"source": "ctx._source.id=params.id;ctx._source.message=params.message","lang": "painless","params":{"id":888,"message":"new哈哈哈","oth":"????"}}
}

可以通过 update 接口,使用 script 的方法来进行修改。这个方法也是需要知道文档的 id

POST test/_update/vPhIC4kB2SZh9y2IU2G6
{"script": {"source": "ctx._source.id=params.id;ctx._source.message=params.message","lang": "painless","params":{"id":999,"message":"new999哈哈哈","oth":"??999??"}}
}
#------返回结果--------
{"_index": "test","_id": "vPhIC4kB2SZh9y2IU2G6","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 9,"_primary_term": 1
}

在我们使用上面的方法更新文档时,如果当前的文档 id 不存在,那么我们甚至可以使用 upsert 属性来创建一个文档:

POST test/_update/3
{"script": {"source": "ctx._source.id=params.id;ctx._source.message=params.message","lang": "painless","params":{"id":999,"message":"new999哈哈哈","oth":"??999??"}},"upsert":{"id":3,"message":"3333333"}
}

我们甚至可以使用 _update 接口使用 ctx[‘_op’] 来达到删除一个文档的目的,比如:

当检测文档的 字段id 是否为 888,如果为 888 的话,那么该文档将被删除,否则将不做任何事情。
POST test/_update/1
{"script": {"source":"""if(ctx._source.id == 888){ctx.op = 'delete'}else {ctx.op = 'none'}"""}
}
#------返回---------
{"_index": "test","_id": "1","_version": 7,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 11,"_primary_term": 1
}

使用 script 的一些高级操作,比如我们可以通过如下的方法来添加一个崭新的字段,新增加了一个叫做 newfield 的字段:

POST test/_update/2
{"script" : {"source": "ctx._source.newfield=4","lang": "painless"}
}
#----------------------
{"_index": "test","_id": "2","_score": 1,"_source": {"id": 888,"message": "new哈哈哈","age": 22222,"newfield": 4}
}
# --------------也可以删除字段-------------
POST test/_update/2
{"script" : {"source": "ctx._source.remove(\"newfield\")","lang": "painless"}
}

在这里请注意的是:一旦一个字段被创建,那么它就会存在于更新的 mapping 中。即便针对 id 为 1 的文档删除了 newfield,但是 newfield 还将继续存在于 twitter 的 mapping 中。我们可以使用如下的命令来查看 twitter 的 mapping:

GET test/_mapping
#---------返回结果-----------
{"test": {"mappings": {"properties": {"age": {"type": "long"},"id": {"type": "keyword"},"message": {"type": "text"},"newfield": {"type": "long"}}}}
}

UPSERT 一个文档

术语 “upsert” 宽松地表示更新或插入,即更新文档(如果存在),否则,插入新文档。

doc_as_upsert 参数检查具有给定ID的文档是否已经存在,并将提供的 doc 与现有文档合并。 如果不存在具有给定 id 的文档,则会插入具有给定文档内容的新文档。

下面的示例使用 doc_as_upsert 合并到 id 为 10 的文档中,或者如果不存在则插入一个新文档:

POST test/_update/10
{"doc":{"age":"10","id":"10","newfield":"55","message":"messssss"},"doc_as_upsert":true
}

检查一个文档是否存在

HEAD test/_doc/10
# ---成功返回---
200 - OK#------不存在-----
404 - Not Found

删除一个文档

DELETE test/_doc/11
#成功返回
{"_index": "test","_id": "11","_version": 2,"result": "deleted","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 17,"_primary_term": 1
}

在不在id的情况下,先查询后删除,以下是把message等于14的都删除

HEAD test/_doc/14
#--
200 - OKPOST test/_delete_by_query
{"query":{"match":{"message":"14"}}
}HEAD test/_doc/14
#---
404 - Not Found

检查一个索引是否存在

HEAD tt
200 - OK

删除一个索引

删除一个索引 是非常直接的。我们可以直接使用如下的命令来进行删除:

DELETE tt
#删除成功返回
{"acknowledged": true
}

批处理命令

上面我们已经了解了如何使用 REST 接口来创建一个 index,并为之创建(Create),读取(Read),修改(Update),删除文档(Delete)(CRUD)。因为每一次操作都是一个 REST 请求,对于大量的数据进行操作的话,这个显得比较慢。ES 创建一个批量处理的命令给我们使用。这样我们在一次的 REST 请求中,我们就可以完成很多的操作。这无疑是一个非常大的好处。下面,我们来介绍一下这个 _bulk 命令。

我们使用如下的命令来进行 bulk 操作:

POST _bulk
{ "index" : { "_index" : "twitter", "_id": 1} }
{"user":"双榆树-张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
{ "index" : { "_index" : "twitter", "_id": 2 }}
{"user":"东城区-老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
{ "index" : { "_index" : "twitter", "_id": 3} }
{"user":"东城区-李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
{ "index" : { "_index" : "twitter", "_id": 4} }
{"user":"朝阳区-老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
{ "index" : { "_index" : "twitter", "_id": 5} }
{"user":"朝阳区-老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
{ "index" : { "_index" : "twitter", "_id": 6} }
{"user":"虹桥-老吴","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}

在上面的命令中,我们使用了 bulk 指令来完成我们的操作。在输入命令时,我们需要特别的注意:千万不要添加除了换行以外的空格,否则会导致错误。在上面我们使用的 index 用来创建一个文档。为了说明问题的方便,我们在每一个文档里,特别指定了每个文档的 id。当执行完我们的批处理 bulk 命令后,我们可以看到:
在这里插入图片描述
在实际的使用中,我们必须注意的是:一个好的起点是批量处理 1,000 到 5,000 个文档,总有效负载在 5MB 到 15MB 之间。如果我们的 payload 过大,那么可能会造成请求的失败。
通过 POST dd/_search 查询
在这里插入图片描述
统计 GET dd/_count
在这里插入图片描述


上面我们已经使用了 index 来创建6条文档记录。我也可以尝试其它的命令,比如 create:

POST _bulk
{ "create" : { "_index" : "dd", "_id": 1} }
{"user":"双榆树-张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
{ "index" : { "_index" : "dd", "_id": 2 }}
{"user":"东城区-老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
{ "index" : { "_index" : "dd", "_id": 3} }
{"user":"东城区-李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
{ "index" : { "_index" : "dd", "_id": 4} }
{"user":"朝阳区-老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
{ "index" : { "_index" : "dd", "_id": 5} }
{"user":"朝阳区-老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
{ "index" : { "_index" : "dd", "_id": 6} }
{"user":"虹桥-老吴","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}

在这里插入图片描述
从上面的信息,我们可以看出来 index 和 create 的区别。index 总是可以成功,它可以覆盖之前的已经创建的文档,但是 create 则不行,如果已经有以那个 id 为名义的文档,就不会成功。

我们可以使用 delete 来删除一个已经创建好的文档:

POST _bulk
{ "delete" : { "_index" : "dd", "_id": 1 }}

在这里插入图片描述
可以看到 id 为1的文档已经被删除了。我可以通过如下的命令来查看一下:在这里插入图片描述
批量修改

POST _bulk
{ "update" : { "_index" : "dd", "_id": 2 }}
{"doc": { "city": "长沙"}}

索引统计

GET dd/_stats同时获得多个索引统计值
GET dd,test/_stats通配符
GET dd*/_stats

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你值得拥有——流星雨下的告白(Python实现)

目录 1 前言 2 霍金说移民外太空 3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事,提一下大家兴趣;然后我给出论据,得出结论。最后再浪漫的流星雨表白代码奉上,还有我自创的一首诗。开始啦: 2 霍金说移民外…

git常用命令之config

14. config 14.1 查看 config 命令作用git config --local -l查看仓库级别git 配置信息git config --global -l查看全局级别git 配置信息git config --system -l查看系统级别git 配置信息git config -l查看所有级别配置信息git config --local --list --show-origingit confi…

Windows开启telnect

1、Telnet是什么? Telnet 是一种网络协议,用于通过网络远程登录到远程计算机或设备上。它允许用户在本地计算机上使用命令行界面(命令提示符)与远程主机进行交互,就像直接在远程主机上操作一样。Telnet 协议使用 TCP/I…

DataSecurity Plus金融行业案例

摘要:DataSecurity Plus是一款强大的数据安全解决方案,为金融机构提供全面的数据保护和合规性监控。本文将介绍DataSecurity Plus在金融行业的使用案例,包括文件审计、数据分类和合规性报告等功能的应用。 DataSecurity Plus 文件审计&#…

如何设置微信小程序启动页及其全屏背景色?

一、设置启动页 打开微信小程序就会进入pages里面的第一个页面,所以只需要在pages.json中,把启动页写在pages的第一项就可以了 二、去掉导航栏,实现全屏显示效果 先清除全局的导航栏标题,在需要全屏的页面,添加以下代…

2023-最新-发布java工具包到 maven 中央仓库,不踩坑

说明 要想将自己的java工具提交到maven中央仓库并公开,但是maven中央仓库是不允许我们直接上传jar包到它上面的,因此我们只能将jar包发布到它指定的第三方maven仓库,然后这个仓库再将jar包同步到中央仓库。而sonatype的OSSRH仓库就是被认可的…

LVS负载均衡群集与LVS-NAT部署实战配置

文章目录 一.什么是集群1.群集的含义 二.集群使用在那个场景三.集群的分类1.负载均衡器群集2.高可用群集3.高性能运算群集 四.负载集群的架构1.第一层,负载调度器2.第二层,服务器池3.第三层,共享存储 五.负载均衡集群的工作模式1.地址转换 &a…

移动端数据可视化设计

在做APP设计的时候,难免会遇到一些需要展示数据的场景。使用传统的表格和文档展示数据不仅难看,也影响用户理解数据的含义。而数据可视化设计能将数据以更加直观的方式展现出来,使数据更加客观、更有说服力。 在移动应用中,数据可…

Hive详解

一 Hive基本概念 1 Hive简介 学习目标 - 了解什么是Hive - 了解为什么使用Hive1.1 什么是 Hive Hive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表 ,并提供 HQL(Hive SQL)查询功能&…

二、Spring Cloud Eureka 简介、快速入门

注册发现中心 Eureka 来源于古希腊词汇,意为“发现了”。在软件领域, Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起&#xff0…

转载-【AI思维空间】Chat2DB 一款开源数据库客户单工具

卸载 Navicat, xxx 又开源了一款数据库神器,太炸了 Chat2DB 是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2D…

64MHz 闪存STM32G0B1CEU6(STM32G0B1CCU6)STM32G0B1CBU6引脚配置图、32位微控制器

STM32G0B1 32位微控制器具有最高512KB嵌入式闪存和144kB RAM存储器。该器件采用48-UFQFPN 引脚封装。它支持USB全速主机/设备、集成USB Type-C控制器和收发器、FDCAN协议以及多达8个UART。 STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用,并可随时…