Elasticsearch基础

2021-01-21  本文已影响0人  JBryan

Docker安装Elasticsearch和Kibana请参考:https://www.jianshu.com/p/804fe0fa6702

1、_cat:

_cat/nodes:查看节点信息


es1.jpg

_cat/health:查看健康状况


es2.jpg
_cat/master:主节点信息
es3.jpg

_cat/indices:查看elasticsearch所有索引(索引可类比MySQL的数据库)


es4.jpg

2、索引一个文档

“索引一个文档”(用MySQL的话来讲,就是插入一条记录),需要指定索引的类型(就是指定哪个库的哪张表)

2.1、PUT

PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。
PUT test/basics/1 插入test索引下,basics类型中,1号数据。

PUT test/basics/1
{
  "name":"Jessie"
}
es5.jpg

返回数据中,_index代表索引(类比数据库),_type代表类型(类比表)。如果相同的请求,发送第二次,result就会变成"updated"。

2.2、POST

POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;


es6.jpg

3、查询文档

GET /test/basics/1

http://192.168.43.129:9200/test/basics/1
{
    "_index": "test",//在哪个索引
    "_type": "basics",//在哪个类型
    "_id": "1",//记录id
    "_version": 1,//版本号
    "_seq_no": 0,//并发控制字段,每次更新都会+1,用来做乐观锁
    "_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
    "found": true,
    "_source": {
        "name": "Jessie"
    }
}

通过“if_seq_no=0&if_primary_term=1 ”,当序列号匹配的时候,才进行修改,否则不修改。
PUT /test/basics/1?if_seq_no=0&if_primary_term=1

es7.jpg
若seq_no不匹配,则更新失败。现在已经修改过id = 1这条数据,并且_seq_no为3,此时,再发上面的请求,就会返回修改失败。
es8.jpg

4、更新文档

4.1、POST更新文档,带有_update

POST /test/basics/1/_update

es9.jpg
更新数据时,会和原来的数据进行对比,如果数据相同,则不会执行更新操作,此时再次发送相同的请求,则不执行任何操作,序列号也不发生变化。
4.2、POST更新文档,不带_update

POST /test/basics/1

es10.jpg
在更新过程中,重复执行更新操作,数据也能够更新成功,不会和原来的数据进行对比。
4.3、PUT更新文档

PUT /test/basics/1

es11.jpg
和POST不带_update执行更新操作一样,不会和原来数据进行对比,如果重复执行更新操作,_seq_no增加。

5、删除索引、文档

在Elasticsearch中,没有删除类型(类比MySQL中的表)操作,只能删除索引和文档。
删除文档:DELETE /test/basics/1

http://192.168.43.129:9200/test/basics/1

{
    "_index": "test",
    "_type": "basics",
    "_id": "1",
    "_version": 6,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 7,
    "_primary_term": 3
}

删除索引:DELETE /test

http://192.168.43.129:9200/test

{
    "acknowledged": true
}

6、bulk批量操作

批量操作无法使用Postman测试,使用kibana执行测试数据。
1、进入Kibana的Dev Tools
访问http://{你的虚拟机地址}:5601,进入Kibana,然后点击左上角选项按钮,找到Dev Tools

es12.jpg
2、执行批量操作
测试数据来自:https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json,全选,复制到Kibana中的Dev Tools执行即可。
POST bank/account/_bulk
es13.jpg

7、mapping映射

Maping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。

7.1、创建映射

这里将email的type设为keyword,指定email字段只能精准匹配,不会进行分词以及全文匹配。而name字段的type为text,会进行分词以及全文匹配。建议将需要进行过滤、聚合等操作的字段设定为keyword,而一些长文本信息设定为text。

PUT /my_index
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "email": {
        "type": "keyword"
      },
      "name": {
        "type": "text"
      }
    }
  }
}

执行结果:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my_index"
}
7.2、查看映射
GET /my_index/_mapping

执行结果:

{
  "my_index" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "integer"
        },
        "email" : {
          "type" : "keyword"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}
7.3、添加新的字段映射
PUT /my_index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

这里的 “index”: false,表明新增的字段不能被检索,只是一个冗余字段。

7.4、更新映射

对于已经存在的字段映射,我们不能更新。更新必须创建新的索引,进行数据迁移
例如要将my_index中age字段的类型改为long。
1、创建新的索引:new_my_index

PUT /new_my_index
{
  "mappings": {
    "properties" : {
        "age" : {
          "type" : "long"
        },
        "email" : {
          "type" : "keyword"
        },
        "employee-id" : {
          "type" : "keyword",
          "index" : false
        },
        "name" : {
          "type" : "text"
        }
      }
  }
}

2、查看new_my_index的映射

GET /new_my_index/_mapping

执行结果:

{
  "new_my_index" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "email" : {
          "type" : "keyword"
        },
        "employee-id" : {
          "type" : "keyword",
          "index" : false
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

3、将my_index中的数据迁移到new_my_index中
先在my_index中插入一条数据:

POST /my_index/_doc
{
  "age": 20,
  "name": "Jessie",
  "email": "Jessie@qq.com",
  "employee-id": 1
}

迁移数据:

POST _reindex
{
  "source": {
    "index": "my_index",
    "type": "_doc"
  },
  "dest": {
    "index": "new_my_index"
  }
}

执行结果:

#! Deprecation: [types removal] Specifying types in reindex requests is deprecated.
{
  "took" : 579,
  "timed_out" : false,
  "total" : 1,
  "updated" : 0,
  "created" : 1,
  "deleted" : 0,
  "batches" : 1,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}

4、查看new_my_index中的数据

GET /new_my_index/_search

执行结果:

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "new_my_index",
        "_type" : "_doc",
        "_id" : "30MpLncBO375z1z5rMtJ",
        "_score" : 1.0,
        "_source" : {
          "age" : 20,
          "name" : "Jessie",
          "email" : "Jessie@qq.com",
          "employee-id" : 1
        }
      }
    ]
  }
}

上一篇下一篇

猜你喜欢

热点阅读