本文介绍如何在Elasticsearch中对文档进行操作。

1、检查Elasticsearch及Kibana运行是否正常

在浏览器输入192.168.6.16:9200,有如下输出则说明Elasticsearch运行正常。

浏览器中输入http://192.168.6.16:5601/,显示如下页面,则说明Kibana运行正常。

2、查看Elasticsearch信息

在kibana Dev tools中输入GET / 指令,同样可以查看Elasticsearch的版本信息及其cluster名称等:

  1. GET /

如下图所示:

当然也可以在terminal中输入相同的指令来达到相同的效果,不过在Kibana中更加直接:

上面的命令拷贝成为cURL,然后粘贴上terminal上去执行,当然也反过来的操作也成立:

3、创建索引和文档

创建一个叫twitter的索引,并插入一个文档。

  1. PUT twitter/_doc/1
  2. {
  3. "user": "GB",
  4. "uid": 1,
  5. "city": "Beijing",
  6. "province": "Beijing",
  7. "country": "China"
  8. }

执行结果如下图:

通过上述方法,可以自动创建索引,如果不想用自动创建索引,可以修改设置。

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "action.auto_create_index": "false"
  5. }
  6. }

通过上述方法写入到Elasticsearch中的文档,默认情况下不会马上可进行搜索,需要refresh操作,使其对搜索可见。通常会有一个refresh timer定时器来完成这个操作,周期周期为1秒,也就是通常说的Elasticsearch可以试系秒级搜索。如果想让结果马上对搜索可见,可以用如下方法:

  1. PUT twitter/_doc/1?refresh=true
  2. {
  3. "user": "GB",
  4. "uid": 1,
  5. "city": "Beijing",
  6. "province": "Beijing",
  7. "country": "China"
  8. }

频繁使用fefresh操作,会使Elasticsearch变得非常慢。所以可以通过另外一种方式refresh=wait_for,相当于同步操作,等待下一个refresh周期发生后才返回。这样可以确保我们在调用上面接口后,马上可以搜索到我们刚才录入的文档。

  1. PUT twitter/_doc/1?refresh=wait_for
  2. {
  3. "user": "GB",
  4. "uid": 1,
  5. "city": "Beijing",
  6. "province": "Beijing",
  7. "country": "China"
  8. }

每次执行post或者put接口时,如果文档已经存在,那么相应的版本会自动加1,之前的版本被抛弃掉。如果不是要更新文档的话,可以使用_create端点接口来实现:

  1. PUT twitter/_create/1
  2. {
  3. "user": "GB",
  4. "uid": 1,
  5. "city": "Shenzhen",
  6. "province": "Guangdong",
  7. "country": "China"
  8. }

此时如果文档已经存在时,系统将返回错误信息。如下图所示:

用如下命令也是一样的效果(op_type可以有两种值:index及create):

  1. PUT twitter/_doc/1?op_type=create
  2. {
  3. "user": "张三",
  4. "message": "Hi",
  5. "uid": 2,
  6. "age": 20,
  7. "city": "北京",
  8. "province": "北京",
  9. "country": "中国",
  10. "address": "中国北京市海淀区",
  11. "location": {
  12. "lat": "39.970718",
  13. "lon": "116.325747"
  14. }
  15. }

4、查看被修改的文档

1)根据id查找文档。

  1. GET twitter/_doc/1

查询结果如下图所示:

可以通过如下命令来获取文档的_source部分:

  1. GET twitter/_doc/1/_source
  2. GET twitter/_source/1 //Elasticsearch 7.0之后建议使用这个命令

2)使用_mget查找多个文档

  1. GET _mget
  2. {
  3. "docs": [
  4. {
  5. "_index": "twitter",
  6. "_id": 1
  7. },
  8. {
  9. "_index": "twitter",
  10. "_id": 2
  11. }
  12. ]
  13. }

可以简写为:

  1. GET twitter/_doc/_mget
  2. {
  3. "ids": ["1", "2"]
  4. }

还可以使用_mget获得部分字段

5、自动ID生成

在上面命令中,作者特意给文档分配了一个ID。在实际应用中,并不必要。相反,手动分配一个ID时,在数据导入时会检查这个ID的文档是否存在,如果存在则更新这个版本,如果不存在,则创建一个新的文档。如果我们不指定文档ID,而让Elasticsearch自动帮我们生成ID,这样速度更快,这种情况下,我们必须使用POST,而不是PUT。比如:

  1. POST my_index/_doc
  2. {
  3. "content": "this is really cool"
  4. }

返回结果显示,系统自动分配一个ID:ju9eG3kBAHJu3CVJ0XaV。

并可以是如下命令查询到刚刚建立的文档:

  1. GET /my_index/_doc/ju9eG3kBAHJu3CVJ0XaV/

6、修改文档

使用PUT并指定一个特定的ID来修改文档。

  1. PUT twitter/_doc/1
  2. {
  3. "user": "GB",
  4. "uid": 1,
  5. "city": "北京",
  6. "province": "北京",
  7. "country": "中国",
  8. "location":{
  9. "lat":"29.084661",
  10. "lon":"111.335210"
  11. }
  12. }

使用PUT修改文档时,需要填写文档中的所有项。如要修改单独项时,可以实现如下方法:

  1. POST twitter/_update/1
  2. {
  3. "doc": {
  4. "city": "成都",
  5. "province": "四川"
  6. }
  7. }

使用_update_by_query来协助搜索文档,然后信息修改。

  1. POST twitter/_update_by_query
  2. {
  3. "query": {
  4. "match": {
  5. "user": "GB"
  6. }
  7. },
  8. "script": {
  9. "source": "ctx._source.city = params.city;ctx._source.province = params.province;ctx._source.country = params.country",
  10. "lang": "painless",
  11. "params": {
  12. "city": "成都",
  13. "province": "四川",
  14. "country": "中国"
  15. }
  16. }
  17. }

修改结果:

执行GET twitter/_doc/1 后,显示数据已修改成功。

对于那些名字是中文字段的文档来说,在 painless 语言中,直接打入中文字段名字,并不能被认可。我们可以使用如下的方式来操作:

  1. POST edd/_update_by_query
  2. {
  3. "query": {
  4. "match": {
  5. "姓名": "张彬"
  6. }
  7. },
  8. "script": {
  9. "source": "ctx._source[\"签到状态\"] = params[\"签到状态\"]",
  10. "lang": "painless",
  11. "params" : {
  12. "签到状态":"已签到"
  13. }
  14. }
  15. }

在update接口中,也可以使用script方法来修改。

  1. POST twitter/_update/1
  2. {
  3. "script" : {
  4. "source": "ctx._source.city=params.city",
  5. "lang": "painless",
  6. "params": {
  7. "city": "长沙"
  8. }
  9. }
  10. }

可以使用 _update 接口使用 ctx['_op'] 来达到删除一个文档的目的,当检测文档的 uid 是否为 1,如果为 1 的话,那么该文档将被删除,否则将不做任何事情。:

  1. POST twitter/_update/1
  2. {
  3. "script": {
  4. "source": """
  5. if(ctx._source.uid == 1) {
  6. ctx.op = 'delete'
  7. } else {
  8. ctx.op = "none"
  9. }
  10. }
  11. }

7、UPSERT

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

  1. POST /catalog/_update/3
  2. {
  3. "doc": {
  4. "author": "Albert Paro",
  5. "title": "Elasticsearch 5.0 Cookbook",
  6. "description": "Elasticsearch 5.0 Cookbook Third Edition",
  7. "price": "54.99"
  8. },
  9. "doc_as_upsert": true
  10. }

8、检查一个文档是否存在

返回200 - OK则说明文档存在。

  1. HEAD twitter/_doc/1

9、删除文档

  1. DELETE twitter/_doc/1

也可以通过查询方式来进行删除,如下语法功能把twitter索引中所有city是上海的文档都删除:

  1. POST twitter/_delete_by_query
  2. {
  3. "query": {
  4. "match": {
  5. "city": "上海"
  6. }
  7. }
  8. }

10、检查索引是否存在

  1. HEAD twitter

11、删除索引

  1. DELETE twitter

12、批处理_bulk

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

使用_search命令查询所有输入的文档

  1. POST twitter/_search

使用_count命令查询有多少条数据:

  1. GET twitter/_count

也可以是create命令创建文档:

  1. POST _bulk
  2. { "create" : { "_index" : "twitter", "_id": 1} }
  3. {"user":"双榆树-张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
  4. { "index" : { "_index" : "twitter", "_id": 2 }}
  5. {"user":"东城区-老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
  6. { "index" : { "_index" : "twitter", "_id": 3} }
  7. {"user":"东城区-李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
  8. { "index" : { "_index" : "twitter", "_id": 4} }
  9. {"user":"朝阳区-老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
  10. { "index" : { "_index" : "twitter", "_id": 5} }
  11. {"user":"朝阳区-老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
  12. { "index" : { "_index" : "twitter", "_id": 6} }
  13. {"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删除一个已经创建好的文档:

  1. POST _bulk
  2. { "delete" : { "_index" : "twitter", "_id": 1 }}

使用update来更新一个文档:

  1. POST _bulk
  2. { "update" : { "_index" : "twitter", "_id": 2 }}
  3. {"doc": { "city": "长沙"}}

Elasticsearch (1) 文档操作的更多相关文章

  1. ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询

    基本概念 索引: 类似于MySQL的表.索引的结构为全文搜索作准备,不存储原始的数据. 索引可以做分布式.每一个索引有一个或者多个分片 shard.每一个分片可以有多个副本 replica. 文档: ...

  2. Elasticsearch索引和文档操作

    列出所有索引 现在来看看我们的索引 GET /_cat/indices?v 响应 health status index uuid pri rep docs.count docs.deleted st ...

  3. elasticsearch——海量文档高性能索引系统

    elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...

  4. 008-elasticsearch5.4.3【二】ES使用、ES客户端、索引操作【增加、删除】、文档操作【crud】

    一.ES使用,以及客户端 1.pom引用 <dependency> <groupId>org.elasticsearch.client</groupId> < ...

  5. 007-elasticsearch5.4.3【一】概述、Elasticsearch 访问方式、Elasticsearch 面向文档、常用概念

    一.概述 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Elasticsearch 也是使用 Java 编写的,它的内部使用 L ...

  6. .Net Api 之如何使用Elasticsearch存储文档

    .Net Api 之如何使用Elasticsearch存储文档 什么是Elasticsearch? Elasticsearch 是一个分布式.高扩展.高实时的搜索与数据分析引擎.它能很方便的使大量数据 ...

  7. ES入门三部曲:索引操作,映射操作,文档操作

    ES入门三部曲:索引操作,映射操作,文档操作 一.索引操作 1.创建索引库 #语法 PUT /索引名称 { "settings": { "属性名": " ...

  8. 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)

    在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文 ...

  9. jQuery 核心 - noConflict() 方法,jQuery 文档操作 - detach() 方法

    原文地址:http://www.w3school.com.cn/jquery/manipulation_detach.asp   实例 使用 noConflict() 方法为 jQuery 变量规定新 ...

随机推荐

  1. Loss Landscape Sightseeing with Multi-Point Optimization

    目录 概 主要内容 代码 Skorokhodov I, Burtsev M. Loss Landscape Sightseeing with Multi-Point Optimization.[J]. ...

  2. NFS 部署

    目录 NFS 部署 NFS简介 NFS应用 NFS工作流程图 NFS部署 服务端 客户端 测试NFS文件同步功能 NFS配置详解 NFS部分参数案例 统一用户 搭建考试系统 搭建步骤 配合NFS实现文 ...

  3. 数据可视化 gojs 简单使用介绍

    目录 1. gojs 简介 2. gojs 应用场景 3. 为什么选用 gojs: 4. gojs 上手指南 5. 小技巧(非常实用哦) 6. 实践:实现节点分组关系可视化交互图 最后 本文是关于如何 ...

  4. 使用 Eclipse 创建一个静态的登录页面

    要求: 使用 Eclipse 创建一个静态的登录页面 实现步骤: 在 Eclipse 中,点击"File",显示菜单,选择"New" "Other&q ...

  5. IIS部署Python-django项目

    1.安装CgiModule模块 首先,IIS要部署django项目,需要CgiModule模块的支持,所以首先我们要确认这个模块是否存在 打开IIS管理器: 我这里是存在的: 如果不存在,可以自行在控 ...

  6. lscpu

    [root@kvm02 ~]# lscpu Architecture: x86_64     #cpu架构CPU op-mode(s): 32-bit, 64-bitByte Order: Littl ...

  7. [ vue ] 解耦vuex(按照组件来组织vuex的结构)

    问题描述 随着应用复杂度的增加,vuex用一个 store/index.js 文件来描述已经很难维护了,我们想把这些状态分割到单独文件里面. 参考1:https://vuex.vuejs.org/zh ...

  8. js 调用同级的 iframe 方法

    有两个 iframe <iframe id="a"> <script> function food(a){ return a+1; } </scrip ...

  9. js字符串数组['1','2','3']转number

    let arr = ['1','2','3']; arr.split(',').map(Number);

  10. vscode 前端好用插件汇总

    本篇文章根据实际开发中使用的扩展插件,结合<精选!15 个必备的 VSCode 插件(前端类)>.<vscode 插件推荐 - 献给所有前端工程师(2017.8.18更新)>中 ...