03、ES实战:索引+文档

一、索引

在上一节我们使用了postman进行了一些简单的添加索引和文本测试,接下来试试在Head和Kibana中进行相关操作。

1.1、新建索引

1.1.1、使用Head新建

在head 插件中,选择 索引选项卡,然后点击新建索引。新建索引时,需要填入索引名称、分片数以及副本数。

*

创建成功后如下图:中间的数字0-4代表分片,粗框表示主分片,细框表示副本。上一节创建的test索引没有指定分片数和副本数,默认只有1分片和1副本。

*

1.1.2、使用Kibana新建

进入Kibana客户端,在右侧选到Dev Tools,在控制台中执行新建操作。

*

新建时如果想指定分片数和副本数,可以在settings中分别设置number_of_shards和number_of_replicas来定义,注意要使用json格式。

*

*

注意:索引名称不能有大写字母,且唯一,否则都会报错。

1.2、索引属性

索引新建之后,还可以使用_settings修改属性,例如修改副本数:

PUT book/_settings
{
  "number_of_replicas": 2
}

_settings中还可以设置很多属性

需要注意,分片数新建之后不能修改。

也可以使用GET请求查看索引属性:

GET goods/_settings         // 查看goods索引属性
GET goods,test/_settings    // 同时查看goods和test索引属性
GET _all/_settings          // 查看所有索引属性

1.3、删除索引

在Head中可以点击索引的动作下拉选项中的删除,在弹出框中输出“删除”即可删除索引。

也可以使用DELETE请求删除

DELETE goods

1.4、索引打开和关闭

POST goods/_close    // 关闭索引
POST goods/_open     // 打开索引

1.5、复制索引

复制索引只会复制数据,不会复制索引的配置属性

POST _reindex
{
  "source": {"index":"goods"},
  "dest": {"index":"goods_new"}
}

1.6、索引别名

如果索引别名是唯一的,可以替代索引名称

POST /_aliases
{
  "actions": [
    {
      "add": { // 将 add 改为 remove 就表示移除别名
        "index": "goods",
        "alias": "goods_alias"
      }
    }
  ]
}

*

GET goods/_alias     // 查看某个索引的别名
GET goods_alias      // 查看某个别名对应的索引
GET _alias           // 查看所有别名

二、文档

2.1、新建文档

使用Kibana分别新建两个文档:

PUT goods/_doc/1
{
  "class": "家电",
  "title": "液晶屏电视机",
  "contest": "创维官方旗舰店85A9 85英寸4K高清智能网络家电平板液晶屏电视机"
}

PUT goods/_doc/2
{
  "class": "家电",
  "title": "吸油烟机",
  "contest": "A.O.史密斯顶侧双吸油烟机CXW-200-Q3+"
}

文档新建成功后,响应的json如下:

{
  "_index" : "goods",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
  • _index 表示文档索引。
  • _type 表示文档的类型。
  • _id 表示文档的 id。
  • _version 表示文档的版本,更新文档时,版本会自动加 1,针对于文档。
  • result 表示执行结果。
  • _shards 表示分片信息。
  • _seq_no和_primary_term这两个也是版本控制用的,针对于索引 index。

可以在head插件中查询数据:

*

说明:新建文档必须包含三个元数据,同时这三个元数据可以唯一标识一个文档:

  • _index:表示文档在哪存放,指索引。我们请求中存放的是goods索引。
  • _type:文档表示的对象类别。我们请求中定义的是_doc。
  • _id:和_index、_type组成文档唯一标识,可以新建文档是时候指定,也可以忽略让es自动生成。我们请求中分别定义的是1和2。

参考官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_Document_Metadata.html

回顾一下,前面我们用postman测试ik分词器时,使用的请求语法和现在有点差别:

POST goods/_create/1
{
  "content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}

1、 我们省略了_type元数据,es会根据文档内容,自动给我们加上_doc的类型:;

*

2、 前面说到es通过三个元数据_index、_type、_id来确认文档唯一性如果请求中没有加上_create参数,es会根据元数据查找文档,文档存在更新数据,不存在则新建文档而加上_create参数后,文档存在会返回409响应码:;

*

3、 es官方文档中,推荐使用POST请求且不指定_id,让es自动生成的方式来新建文档如果业务中必须指定_id,或者已经有自己的_id,那么可以用以下两种方式告诉Elasticsearch,只有相同的_index、_type、_id都不存在时,才创建新文档;

  • 使用op-type查询-字符串参数,如:PUT /goods/_doc/1?op_type=create
  • 在URL 末端使用/_create,如:PUT /goods/_doc/1/_create

参考官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/create-doc.html

2.2、获取文档

可以使用GET请求查看文档,同样也是通过三个元数据指定查询。存在返回文档数据,不存在返回404响应码和报错信息。

GET goods/_doc/1

**

同样也支持批量查询。在js中,HTTP 请求库是不允许 GET 请求有请求体的,虽然 es 工程师倾向于使用 GET 做查询,但是为了保证兼容性,es 同时也支持使用 POST 查询。

GET goods/_mget
{
  "ids": ["1","2"]
}

2.3、文档更新

注意,文档更新一次,version就会自增1。

1、 像前面说的,可以三个元数据指定文档,直接更新整个文档这种更新会覆盖掉原文档,要谨慎使用!

2、 大多数时候,我们只需要更新文档字段,可以通过脚本实现更新的请求格式:POST{index}/_update/{id};

POST goods/_update/1
{
  "script": {
    "lang": "painless",
    "source":"ctx._source.class=params.class",
    "params": {
      "class":"大家电"
    }
  }
}

在脚本中,lang 表示脚本语言,painless 是 es 内置的一种脚本语言。source 表示具体执行的脚本,ctx 是一个上下文对象,通过 ctx 可以访问到文档具体内容。

3、 往文档中添加字段;

POST goods/_update/1
{
  "script": {
    "lang": "painless",
    "source":"ctx._source.price=11999"
  }
}

4、 使用更复杂的ifelse;

POST goods/_update/1
{
  "script": {
    "lang": "painless",
    "source":"if (ctx._source.price < 10000) {ctx._source.price = 10000} else {ctx._source.price = 15000}"
  }
}

5、 查询更新,将查询和更新操作合并,通过条件查询到文档再执行更新例如查询价格price为10000的商品,将价格更新为15000;

POST goods/_update_by_query
{
  "script": {
    "lang": "painless",
    "source":"ctx._source.price = 15000"
  },
  "query": {
    "term": {
      "price": "10000"
    }
  }
}

2.4、文档删除

1、 根据id删除,请求格式为:DELETE{index}/{_type}/{id};

DELETE goods/_doc/1

如果在添加文档时指定了路由,则删除文档时也需要指定路由,否则删除失败。

2、 查询删除,使用POST请求删除price为11999的文档,和删除goods索引下所有文档;

POST goods/_delete_by_query
{
  "query": {
    "term": {
      "price": "11999"
    }
  }
}
POST goods/_delete_by_query
{
  "query": {
    "match_all": {
      
    }
  }
}

2.5、批量操作

es中通过 Bulk API 可以执行批量索引、批量删除、批量更新等操作。

参考官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html

版权声明:

本文仅记录ElasticSearch学习心得,如有侵权请联系删除。
更多内容请访问原创作者:
微信公众号:江南一点雨 *
B站:https://space.bilibili.com/49484631?from=search&seid=6136072956000981995

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: