Elasticsearch 的简单使用

作者: hedeqiang

发布时间: 2019-11-29 16:46:37

安装

关于安装就不多说了,以前的版本安装起来还停麻烦,需要你预先 安装 JDK,但是 Elasticsearch 7 及以后的版本相对来说 安装非常简单,内置一个 OpenJDK,只需要下载 Elasticsearch 的安装包、解压、运行即可

关于下载你可以直接在以下链接中找到最新版下载

Elastic 具有很多丰富的产品,你可以在这里找到 产品

关于下载安装包 直接运行、解压我就不说了,接下来我演示使用 Docker ,并引入一个开箱即用的 Docker 环境

docker-elk 内置了 很多产品,比如 ElasticsearchKibanaLogstash 等,我们只需要简单的命令即可运行

git clone https://github.com/deviantony/docker-elk.git

我们做下简单的修改使 Kiana 支持中文

编辑 docker-compose.yml,添加 environment 环境

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"    
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

接着就可以运行了,(镜像编译可能需要一丢丢的时间)

docker-compose up

之后就可以打开浏览器测试了, Elasticsearch 默认的端口是:9200, Kibana 默认端口是:5601

默认是 启用安全套件的,默认用户名:elastic,密码:changeme,当然你可以做修改参考文档做修改,我这里就不做过多的介绍了。

打开浏览器运行 http://127.0.0.1:9200,输入用户名,密码应该就可以看到如下界面。

file

看下 Kibana ,http://127.0.0.1:5601 file

可以看到 已经开启了中文。

至此,我们的环境就准备好了。

文档增删改查

再开始讲之前 先说下 Kibana 的开发者工具,我们接下来使用的命令操作,都将在开发者工具中进行

file

创建文档


POST users/_doc
{
  "name":"hedeqiang",
  "age":18,
  "city":"北京"
}

file

可以看到 采用 POST 方法,ES 会默认生成一个 _id ,那么如果我们自己生成呢?我们可以采用 PUT 请求来指定 id

PUT users/_doc/1
{
  "name":"PHP",
  "age":7,
  "city":"上海"
}

返回响应为:

file

如果我们重复执行一个文档 ID 的话,ES 会怎样呢?如果我们还是执行上面的 PUT 方法,那么 ES 会认为我们修改,他的 resultupdate_version 每次操作都会递增加 1。

file

可以看到 我们又添加了一个字段,又执行成功了,同时版本号增加, resultupdate, 说明 PUT 方法如果添加一个不存在的 id,会创建该文档,否则会进行修改操作。(会将旧文档删除,再将新文档写入,同时版本 + 1)

如果我们并不希望每次操作版本都加 1 ,那么我们改怎么操作呢?,那么我们可以使用 _create 端点来实现:

PUT users/_create/2
{
  "name":"Laravel",
  "age":7,
  "city":"张家口",
  "address":"张家口南"
}

file

如果使用 _create 添加一个已存在的文档,那么将会报错,不允许添加

PUT users/_create/2
{
  "name":"Laravel",
  "age":7,
  "city":"张家口",
  "address":"张家口南"
}

响应为:

{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[2]: version conflict, document already exists (current version [1])",
        "index_uuid": "qBZ16rnoR1aq5s8LlaIafA",
        "shard": "0",
        "index": "users"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[2]: version conflict, document already exists (current version [1])",
    "index_uuid": "qBZ16rnoR1aq5s8LlaIafA",
    "shard": "0",
    "index": "users"
  },
  "status": 409
}

获取文档(查)

获取单个文档

GET users/_doc/1

file

我们也可以一次性获取多个文档,采用 _mget 进行批量读取:

GET _mget
{
  "docs":[
    {
      "_index":"users",
      "_id":1
    },
    {
      "_index":"users",
      "_id":2
    }
  ]
}

file

修改文档

POST users/_update/1
{
  "doc": {
    "mobile":"15099999999"
  }
}

file

file

通常情况下,我们需要查询某些条件,然后进行修改,比如我们并不知道文档的 ID,那么可以采用 _update_by_query 的方式来进行搜索。

POST users/_update_by_query
{
  "script": {
    "source": "ctx._source.age++",
    "lang": "painless"
  },
  "query": {
    "term": {
      "name": "php"
    }
  }
}

删除文档

DELETE users/_doc/1  

同理,删除文档也可以指定条件采用 _delete_by_query

POST users/_delete_by_query
{
  "query": {
    "match": {
      "name": "php"
    }
  }
}

批处理 _bulk API

支持一次 API 操作,对不同索引进行操作,同时支持四种操作类型 indexcreateupdatedelete

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

返回结果:

{
  "took" : 369,
  "errors" : false,
  "items" : [
    {
      "index" : {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 0,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "delete" : {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "2",
        "_version" : 1,
        "result" : "not_found",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 1,
        "_primary_term" : 1,
        "status" : 404
      }
    },
    {
      "create" : {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "3",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 2,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "update" : {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_version" : 2,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 3,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}

首先创建了一个 test 的索引,然后删除一个不存在的文档,看到提示 not_found,可以看到,执行的所有结果都返回了

以上就是 简单演示了 Elasticsearch 简单的增删改查操作。简单入个门。接下来深入学习搜索方面的 API。

关于极客返利

极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

https://geek.laravelcode.cn

https://geek.idaka.ink

版权许可

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

转载无需与我联系,但须注明出处,注明文章来源 Elasticsearch 的简单使用