Skip to content

索引简单操作

创建索引

Postman 进行测试

由于我的 ElasticSearch 部署到在公关上,且有账号和密码

所以地址为:http://用户名:密码@url

本地则为:http://127.0.0.1:9200

image-20210620230253506

json
{
    //响应结果
    "acknowledged": true,
    //分片结果
    "shards_acknowledged": true,
    //索引名称
    "index": "shopping"
}

注意:创建索引库的分片数默认 1 片,在 7.0.0 之前的 Elasticsearch 版本中,默认 5 片

Kibana的 dev tool 进行测试

如果重复添加索引,会返回错误信息

image-20210620231434956

为了方便测试,后续使用kibana的dev tool来进行学习测试

查看和删除索引

查看所有索引

sh
GET /_cat/indices?v

image-20210620231732554

这里请求路径中的_cat 表示查看的意思,indices 表示索引,所以整体含义就是查看当前 ES 服务器中的所有索引

表头含义
health当前服务器健康状态:
green(集群完整);yellow(单点正常、集群不完整);red(单点不正常)
status索引打开、关闭状态
index索引名
uuid索引统一编号
pri主分片数量
rep副本数量
docs.count可用文档数量
docs.deleted文档删除状态(逻辑删除)
store.size主分片和副分片整体占空间大小
pri.store.size主分片占空间大小

查看单个索引

sh
GET /shopping

查看索引向 ES 服务器发送的请求路径和创建索引是一致的。但是 HTTP 方法不一致。这里可以体会一下 RESTful 的意义,

响应结果:

json
{
  "shopping" : {//【索引名】
    "aliases" : { },//【别名】
    "mappings" : { },//"【映射】
    "settings" : {
      "index" : {
        "creation_date" : "1624201817578",//【创建时间】
        "number_of_shards" : "1",//【主分片数量】
        "number_of_replicas" : "1",//【副分片数量】
        "uuid" : "5fPfnRjcTuyxReq7AFKQnw",//【唯一标识】
        "version" : {
          "created" : "7060199"//【版本】】
        },
        "provided_name" : "shopping"
      }
    }
  }
}

删除索引

  • DELETE /索引
sh
DELETE /shopping
json
{
  "acknowledged" : true
}

批量索引文档_bulk

ES 还提供了批量操作,比如这里我们可以使用批量操作来插入一些数据,供我们在后面学习使用。

使用批量来批处理文档操作比单独提交请求要快得多,因为它减少了网络往返。

数据的格式如下

json
{
  "account_number": 0,
  "balance": 16623,
  "firstname": "Bradshaw",
  "lastname": "Mckenzie",
  "age": 29,
  "gender": "F",
  "address": "244 Columbus Place",
  "employer": "Euron",
  "email": "bradshawmckenzie@euron.com",
  "city": "Hobucken",
  "state": "CO"
}

例如把文件复制到 ES 目录的 data

docker:

sh
docker cp /home/accounts.json  06c5914709a5:/usr/share/elasticsearch/data/

然后执行

sh
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary @accounts.json

如果在其他目录,例如 /opt//accounts.json

sh
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@/opt/accounts.json"

或者我们可以直接插入数据:

注意格式json和text均不可,要去kibana里Dev Tools

POST http://localhost:9200/bank/_bulk

两行为一个整体,index代表索引,也就是保存操作,下面一行为保存的数据

{"index":{"_id":"1"}}
{"name":"a"}
{"index":{"_id":"2"}}
{"name":"b"}
  • 语法格式:

action:执行的动作,新增,修改,删除等

metadata:要操作的数据,比如id是多少

{action:{metadata}}\n
{request body  }\n

{action:{metadata}}\n
{request body  }\n

这里的批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。

bulk API 以此按顺序执行所有的 action(动作)。如果一个单个的动作因任何原因而失败, 它将继续处理它后面剩余的动作。当 bulk API 返回时,它将提供每个动作的状态(与发送 的顺序相同),所以您可以检查是否一个指定的动作是不是失败了。

  • 实例:

    对于整个索引执行批量操作(需在kibana里Dev Tools)

    当没指定任何索引时,就是对整个作批量操作

    POST /_bulk
    {"delete":{"_index":"website","_type":"blog","_id":"123"}}
    {"create":{"_index":"website","_type":"blog","_id":"123"}}
    {"title":"my first blog post"}
    {"index":{"_index":"website","_type":"blog"}}
    {"title":"my second blog post"}
    {"update":{"_index":"website","_type":"blog","_id":"123"}}
    {"doc":{"title":"my updated blog post"}}

文档基本操作

添加数据 PUT

  • 添加用户1
sh
PUT /stars/_doc/1
{
  "name": "蔡徐坤",
  "age": "22",
  "desc": "鸡你太美",
  "tags": ["唱","跳","rap","篮球"]
}

得到响应如下:

json
{
  "_index" : "stars",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
  • 添加用户2
sh
PUT /stars/_doc/2
{
  "name": "吴亦凡",
  "age": "29",
  "desc": "大碗宽面",
  "tags": ["加拿大","电鳗","说唱","嘻哈"]
}
  • 添加用户3
sh
PUT /stars/_doc/3
{
  "name": "吴小凡",
  "age": "10",
  "desc": "一个吴小凡",
  "tags": ["帅哥","干饭"]
}

查询数据 GET

  • 简单查询
sh
GET /stars/_doc/1
json
{
  "_index" : "stars",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "蔡徐坤",
    "age" : "22",
    "desc" : "鸡你太美",
    "tags" : [
      "唱",
      "跳",
      "rap",
      "篮球"
    ]
  }
}
  • 条件查询_search?q=

例如查询 name 是 赵深宸

sh
GET /stars/_search?q=name:吴小凡
json
{
  "took" : 996,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.5902672,
    "hits" : [
      {
        "_index" : "stars",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 2.5902672,
        "_source" : {
          "name" : "吴小凡",
          "age" : "10",
          "desc" : "一个吴小凡",
          "tags" : [
            "帅哥",
            "干饭"
          ]
        }
      },
      {
        "_index" : "stars",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.3862942,
        "_source" : {
          "name" : "吴亦凡",
          "age" : "29",
          "desc" : "大碗宽面",
          "tags" : [
            "加拿大",
            "电鳗",
            "说唱",
            "嘻哈"
          ]
        }
      }
    ]
  }
}
  • 查询所有
sh
GET /stars/_search
{
  "query": { 
    "match_all": {} 
  }
}

相关字段解释

  • took – Elasticsearch运行查询所花费的时间(以毫秒为单位)
  • timed_out –搜索请求是否超时
  • _shards - 搜索了多少个碎片,以及成功,失败或跳过了多少个碎片的细目分类。
  • max_score – 找到的最相关文档的分数
  • hits.total.value - 找到了多少个匹配的文档
  • hits.sort - 文档的排序位置(不按相关性得分排序时)
  • hits._score - 文档的相关性得分(使用match_all时不适用)

更新数据 POST

  • post
sh
POST /stars/_doc/1/_update
{
  "doc": {
    "name": "坤坤"
  }
}
json
{
  "_index" : "stars",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}

_version - 版本,也就是更新次数

result - 操作结果为更新

  • put

也可覆盖数据来更新

sh
PUT /stars/_doc/1
{
  "name": "蔡坤坤",
  "age": "22",
  "desc": "鸡你太美",
  "tags": ["唱","跳","rap","篮球"]
}

删除数据 DELETE

删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。

  • 根据 ID 删除数据
sh
DELETE /stars/_doc/1
  • 条件删除文档

一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除

例如:查询 age 为 22 的

sh
POST /stars/_delete_by_query
{
 "query":{
   "match":{
     "age": 22
   }
 }
}

索引的自动创建

添加数据时,没有索引会自动创建索引和字段

sh
PUT /customer/_doc/1
{
  "name": "John Doe"
}

我们可以查看下这个索引的 mapping => GET /customer/_mapping

json
{
  "customer" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

那么如果我们需要对这个建立索引的过程做更多的控制:比如想要确保这个索引有数量适中的主分片,并且在我们索引任何数据之前,分析器和映射已经被建立好。那么就会引入两点:第一个禁止自动创建索引,第二个是手动创建索引

  • 禁止自动创建索引

可以通过在 config/elasticsearch.yml 的每个节点下添加下面的配置:

sh
action.auto_create_index: false

索引的格式

在请求体里面传入设置或类型映射,如下所示:

sh
PUT /my_index
{
    "settings": { ... any settings ... },
    "mappings": {
        "properties": { ... any properties ... }
    }
}
  • settings: 用来设置分片,副本等配置信息
  • mappings: 字段映射,类型等
    • properties: 由于type在后续版本中会被Deprecated, 所以无需被type嵌套

索引管理操作

https://www.pdai.tech/md/db/nosql-es/elasticsearch-x-index-mapping.html#索引管理操作

文章来源于自己总结和网络转载,内容如有任何问题,请大佬斧正!联系我