ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

04 索引元数据

GET user/_doc/1

# 输出
{
  "_index" : "user",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "firstname" : "san",
    "lastname" : "zhang"
  }
}

_index元数据

  1. 代表一个document存放在哪个索引中。
  2. 索引名称必须都是小写,不能下划线开头,不能包含逗号。
  3. index内的document的结构尽量一致。

_type元数据

  1. 代表document属于index中的哪个类别(type)。从7.0版本开始,一个索引只能一个一个类别,类别名称为“_doc”.
  2. type名称可以是大写或小写。不能下划线开头,不能包含逗号。

_id元数据

  1. 代表document的唯一标识,与index和type一起,可以唯一标识和定位一个document
  2. 我们可以手动指定document的id,也可以不指定,由es自动为我们创建一个id。一般来说, 是从某些其他的系统中,导入一些数据到es时,会采取指定id的方式,就是使用系统中已有数据的的唯一标识, 作为es中document的id。自动生成的id,长度为20个字符;采用base64编码,是URL安全的,可以放在URL中使用;采用GUID方式生成的, 分布式系统并行生成时不会发生冲突。

_document元数据

document删除的机制:

es会将老的document标记为deleted, 并不会立即进行物理删除,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document。

_source元数据

_source元数据: 就是说,我们在创建一个document的时候, 使用的那个放在request body中的json串,默认情况下,在get的时候,会原封不动的给我们返回回来。

  1. 可以在request body中指定_source{},来实现投影操作。

_version元数据

_version:document的修改的版本号。

推荐文档:https://www.cnblogs.com/duanxz/p/5209058.html

  1. ES的并发控制是通过基于版本号控制的乐观锁实现的:一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会+1。当线程A要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值与当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。
  2. 向ES发起请求时,可是带上版本号:PUT user/_doc/1?version=1,此时,只有ES中document的当前版本号与请求的版本号一致,请求才会生效。注意:一些老的版本es使用version,但是新版本不支持了,会报错,提示我们用if_seq_noif_primary_term,例如POST user/_doc/1/_update?if_seq_no=2&if_primary_term=1
  3. ES允许不使用内置的version进行版本控制,可以自定义使用外部的version,例如常见的使用Elasticsearch做数据查询加速的经典方案,关系型数据库作为主数据库,然后使用Elasticsearch做搜索数据,主数据会同步数据到Elasticsearch中,而主数据库并发控制,本身就是使用的乐观锁机制,有自己的一套version生成机制,数据同步到ES那里时,直接使用更方便。POST /duan/_doc/1?version=2&version_type=external
  4. 唯一的区别内置_version,只有当你提供的version与es中的_version完全一样的时候,才可以进行更新,否则报错;外部_version,只有当你提供的version比es中的_version大的时候,才能完成修改。
  5. 在进行更新操作的时候,可以指定乐观锁重试次数。例如POST /test_index/_update/3?retry_on_conflict=5

搜索返回的元数据

GET user/_search/

# 输出:
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "firstname" : "san",
          "lastname" : "zhang"
        }
      }
    ]
  }
}
  • took:整个搜索请求花费了多少毫秒

  • hits.total:本次搜索,返回了几条结果

  • hits.max_score:本次搜索的所有结果中,最大的相关度分数是多少,每一条document对于search的相关度,越相关,_score分数越大,排位越靠前_

  • hits.hits:默认查询前10条数据,按照_score降序排序。可以通过size参数指定返回条数。

  • shards:shards fail的条件是primary和其对应的replica全部挂掉。一个shard失败,并不影响其他shard,比不过返回的数据可能会少了失败的shar的那部分数据。默认情况下来说,一个搜索请求,会打到一个index的所有primary shard上去,当然了,每个primary shard都可能会有一个或多个replica shard,所以请求也可以到primary shard的其中一个replica shard上去。

  • timeout:默认情况下,shard没有设置timeout。指定timeout后,每个shard就会在timeout时间内,将搜索到的部分(或全部)数据立即返回给client,而不是等待所有的数据都搜索出来后再返回。目的:让一次请求可以在用户指定的时间内完成,为一些时间敏感的应用提供良好的支持。

    示例:GET /_search?timeout=10m,timeout可以指定时间单位,默认为ms。例如timeout=10ms,timeout=1s,timeout=1m