1.3 Elasticsearch Document(文档)的管理

课程环境


Document 介绍

  • Document 是 Elasticsearch 最小的数据单元,可以理解为数据库结构中的一行数据。
  • Document 的数据格式是用 JSON 来表示的,如下:
{
  "email": "gitnavi@qq.com",
  "login_name": "youmeek",
  "card_info": {
    "card_name": "zhangsan",
    "card_num": "350111199002205317"
  },
  "create_date": "2017-05-30 12:04:54"
}
  • 用 JSON 的好处是可以表达复杂的对象结构,比如一个对象中含有另外一个子对象,子对象中还有集合的子子对象等,也符合当前业界的易用的数据交流。

Document 的简单 CURD

  • 新增 3 条 Document(如果没有 Index 和 Type 会自动提前在创建):
PUT /product_index/product/1
{
    "product_name" : "PHILIPS toothbrush HX6730/02",
    "product_desc" :  "【3?9 元,前 1000 名赠刷头,6 月 1 日 0 点火爆开抢,618 开门红巅峰 48 小时,抢先加入购物车】飞利浦畅销款,万千好评!深入净齿,智能美白!",
    "price" :  399.00
}

PUT /product_index/product/2
{
    "product_name" : "Braun toothbrush 2000 3D",
    "product_desc" :  "6 月 1 日 16 点秒杀,仅 329 元!限量 1000 支,抢完即止!带压力感应提醒,保护牙龈,高效清洁",
    "price" :  499.00
}

PUT /product_index/product/3
{
    "product_name" : "iphone7 shell",
    "product_desc" :  "一说到星空,就有太多美好的记忆,美丽的浩瀚宇宙,有太多说不清的神秘之处,星空太美丽,太绚烂!",
    "price" :  36.00
}

PUT /product_index/product/4
{
    "product_name" : "iphone7 shell4",
    "product_desc" :  "一说到星空4,就有太多美好的记忆,美丽的浩瀚宇宙,有太多说不清的神秘之处,星空太美丽,太绚烂!",
    "price" :  36.00
}

PUT /product_index/product/5
{
    "product_name" : "iphone7 shell5",
    "product_desc" :  "一说到星空5,就有太多美好的记忆,美丽的浩瀚宇宙,有太多说不清的神秘之处,星空太美丽,太绚烂!",
    "price" :  36.00
}

## POST 方式新增数据,不指向 ID 会自动生成一个 20 位的字符串 ID。
POST /product_index/product
{
    "product_name" : "iphone6 shell",
    "product_desc" :  "真正 360° 全包边 防指纹防摔",
    "price" :  28.00
}
  • 查询/检索 Document:
    • 通过 ID 查询(默认返回所有元数据):GET /product_index/product/3
    • 通过 ID 查询(返回指定元数据):GET /product_index/product/3?_source=product_name,product_desc
    • 查询指定索引的所有数据:GET /product_index/product/_search
    • 设置查询超时:GET /product_index/product/_search?timeout=5s官网资料
    • 查询多个索引:GET /product_index,order_index/_search
    • 查询多个索引、多个类型:GET /product_index,order_index/product,order/_search
    • 查询所有索引、多个类型:GET /_all/product,order/_search
    • 匹配符模糊查询多个索引:GET /product_*/_search
    • 通过商品名搜索,并价格倒序:GET /product_index/product/_search?q=product_name:toothbrush&sort=price:desc
    • 通过商品名搜索(商品名称不等于搜索词,这里用了减号),并价格倒序:GET /product_index/product/_search?q=-product_name:toothbrush&sort=price:desc
  • 普通分页查询:
    • 查询所有结果(假设一共 5 条数据):GET /product_index/product/_search
    • 普通分页(查询第 1 页,每页 2 条数据。from 不是页数,是第几条数据开始):GET /product_index/product/_search?from=0&size=2
    • 普通分页(查询第 2 页,每页 2 条数据。from 不是页数,是第几条数据开始):GET /product_index/product/_search?from=2&size=2
    • 普通分页(查询第 3 页,每页 2 条数据。from 不是页数,是第几条数据开始):GET /product_index/product/_search?from=4&size=2
  • 深度分页(Deep Paging):
    • 深度分页的机制过程可以看这篇:使用scroll实现Elasticsearch数据遍历和深度分页
    • 简单讲就是,用 from&size 这样的方式查询大页数是很耗 CPU、IO、内存、网络,所以对于大分页都是被避免的。你可以看下 Google、百度、淘宝、京东等网站的搜索结果页面,一般最多 100 页。
    • 解决办法用:scroll,一般用于一批一批处理数据,比如做定时任务处理某一批大数据的时候。
    • scroll = 1m 表示用来缓存时间
    • “size”: 2 用来控制查询结果数量
GET /product_index/product/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "sort": [
    "_doc"
  ],
  "size": 2
}
  • 上面的查询结果会返回一个 scroll_id,下面的查询可以用 scroll_id 继续查询。其他条件不需要再加,scroll_id 已经有记录。因为只缓存 1m,必须在 1m 中查询,不然 scroll_id 会失效。
GET /_search/scroll
{
    "scroll": "1m", 
    "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAABtNFlMxdDcyNlVaVHBtMDhkWDVIakZIVHcAAAAAAAAbUxYtQUdCeVVCY1RBSzI3eDFjVVlaZXpnAAAAAAAAG08WUzF0NzI2VVpUcG0wOGRYNUhqRkhUdwAAAAAAABtUFi1BR0J5VUJjVEFLMjd4MWNVWVplemcAAAAAAAAbThZTMXQ3MjZVWlRwbTA4ZFg1SGpGSFR3"
}
  • 更新整个 Document(需要带上所有属性,注意细节,这里改了 product_name):
    • 这种方式的本质是:软删除。把旧版本标记为 deleted,实际还没物理删除,该条数据的 _version 元数据其实会再 +1 的。如果你再 PUT 下还是这个 ID 数据进去,_version 还是会继续 +1。当 Elasticsearch 数据越来越多,会物理删除这些标记的数据。
PUT /product_index/product/3
{
    "product_name" : "星空太空 iphone7 plus 蓝紫色 6s 繁星 7plus 宇宙 se 原创保护苹果 5 包手机壳",
    "product_desc" :  "一说到星空,就有太多美好的记忆,美丽的浩瀚宇宙,有太多说不清的神秘之处,星空太美丽,太绚烂!",
    "price" :  36.00
}
  • 更新 Document 其中一个 field:(这种叫做:partial update,整个流程本质跟全量更新差不多,都是先把旧的标记为 deleted,新的数据创建。只是查询这个过程是在 Elasticsearch 内部,效率更高。)
POST /product_index/product/3/_update
{
  "doc": {
    "product_name": "星空太空 iphone7 蓝紫色 6s 繁星 iphone7 plus 宇宙 se 原创保护苹果 5 包手机壳"
  }
}
  • 删除 Document:
    • 通过 ID 删除:DELETE /product_index/product/3,本质:标记为 deleted,等数据越来越大的情况 Elasticsearch 才去物理删除。

Document 操作返回结果的几个重要参数讲解

  • 查询所有 Document:GET /product_index/product/_search,返回结果:
{
  "took": 3, ## 表示查询花费的时间(单位毫秒)
  "timed_out": false, ## 是否超时
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3, ## 查询结果的数量
    "max_score": 1, ## 最大相关数分数是 1,每一条查询出来的结果数据,跟 search 条件越相关的,排名越靠前,分数也就越大。
    "hits": [ ## 查询结果的详细数据集合
      {
        "_index": "product_index",
        "_type": "product",
        "_id": "2",
        "_score": 1,
        "_source": {
          "product_name": "Braun toothbrush 2000 3D",
          "product_desc": "6 月 1 日 16 点秒杀,仅 329 元!限量 1000 支,抢完即止!带压力感应提醒,保护牙龈,高效清洁",
          "price": 499
        }
      },
      {
        "_index": "product_index",
        "_type": "product",
        "_id": "1",
        "_score": 1,
        "_source": {
          "product_name": "PHILIPS toothbrush HX6730/02",
          "product_desc": "【3?9 元,前 1000 名赠刷头,6 月 1 日 0 点火爆开抢,618 开门红巅峰 48 小时,抢先加入购物车】飞利浦畅销款,万千好评!深入净齿,智能美白!",
          "price": 399
        }
      },
      {
        "_index": "product_index",
        "_type": "product",
        "_id": "3",
        "_score": 1,
        "_source": {
          "product_name": "iphone7 shell",
          "product_desc": "一说到星空,就有太多美好的记忆,美丽的浩瀚宇宙,有太多说不清的神秘之处,星空太美丽,太绚烂!",
          "price": 36
        }
      }
    ]
  }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JadePeng的技术博客

HTML5录音控件

最近的项目又需要用到录音,年前有过调研,再次翻出来使用,这里做一个记录。 HTML5提供了录音支持,因此可以方便使用HTML5来录音,来实现录音、语音识别等功能...

1.2K5
来自专栏iOSDevLog

用Kotlin破解Android版微信小游戏-跳一跳成果跳一跳思路源码使用方法参考来源Android 插件 免PC

3736
来自专栏编程之旅

iOS开发 —— Swift版地址选择器

已经有二十多天没有更新自己的博客了,这段时间经历了很多事情,离开了生活了六七年的杭州,从离职再入职,忙的是一塌糊涂。

1092
来自专栏cmazxiaoma的架构师之路

蛋疼的ElasticSearch(四)之基本用法、高级查询

ElasticSearch系列文章: 1.蛋疼的ElasticSearch(一)之安装ElasticSearch 2.蛋疼的ElasticSearch(二)...

874
来自专栏不二小段

Python自动统计微博抽奖中奖男女比例(附代码)

今天来写一个自动计算微博抽奖男女比例的代码,很早就应该发这篇了,只是不想蹭热点(才不是拖更)。

1313
来自专栏Crossin的编程教室

【Python 第4课】输入

Hi~Crossin又来了。 可以用编程语言让计算机按你说的指令做事情之后,大家是不是有些跃跃欲试呢?别着急,先回顾一下我们之前几节课。我们到现在一共提到了三种...

3167
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说,来一波神的视角

3096
来自专栏Albert陈凯

2018-06-18 自动化测试selenium在小公司的成功实践自动化测试selenium在小公司的成功实践前言背景相关知识正式实践github项目运行写在最后

3567
来自专栏Android小菜鸡

Android Touch事件传递机制

  Touch事件的传递机制与生活贴近,从父布局开始一步一步的向下分发事件。分发事件时调用boolean dispatchTouchEvent(MotionEv...

1803
来自专栏PHP在线

php中关于mysqli和mysql区别的一些知识点分析

一: PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,...

28510

扫码关注云+社区