es学习(二)-快速开始

本文主要记录官方文档学习过程 https://www.elastic.co/guide/en/elasticsearch/reference/7.6/getting-started.html

快速开始

运行es

环境准备

由于我使用的win10,所有环境基于windows环境。
jdk:java version "1.8.0_211"
es版本:7.6.2
(这里提供一个下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip)

启动

安装好jdk,解压好es后,我们就可以启动了

  • 找到es的安装目录下面的bin目录,我这里是:C:\Users\admin\workspace\Enviroments\es\kibana-7.6.2-windows-x86_64\bin

  • Shift+鼠标右键在bin目录中打开powershell,执行命令:**.\elasticsearch.bat**

这样,我们就启动成功了一个es实例,下面我们可以通过cat API来验证下,有两种方式:

  1. 如果你安装了Kibana,直接在控制台输入:GET /_cat/health?v(推荐这种方式,学习阶段比较方便,后面也是这种方式来实验)
  2. 也可以使用curl命令,打开cmd,执行命令:curl -XGET "http://localhost:9200/_cat/health?v"
warning:
注意,上面第二种方式,在powershell中报错,可以改用以下方式:
curl -uri "http://localhost:9200/_cat/health?v" -Method 'GET'

结果大概是这样的:

执行结果

上面的启动命令只是单节点启动,多节点得话,可以试试以下命令:
.\elasticsearch.bat -E path.data=data2 -E path.logs=log2
.\elasticsearch.bat -E path.data=data3 -E path.logs=log3

索引文件

在启动好了es后,我们可以为一些数据建立索引。方式如下:

PUT /customer/_doc/1
{
  "name": "zhangshan"
}

注意:如果,不加id,es会自动生成一个id

上面请求创建一个名为customer的索引(如果不存在创建),添加一个ID为1的新文档,存储name字段并为其创建索引。执行后,返回结果如下:

![创建文档]/images/createDocument.png “POST结果返回”)

新建后,我们可以查询我们创建的文档:

GET /customer/_doc/1

结果如下:
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "zhangshan"
  }
}

批量索引

当文档数量过大的时候,我们可以通过批量索引的方式来提高插入效率,具体操作如下:

  1. 下载json文件,我们可以使用官网的文件,下载地址如下:accounts.json
  2. 在下载的文件目录下,打开gitbash,执行命令:curl -H "Content-Type: application/json" -XPOST "localhost:9200/mybank/_bulk?pretty&refresh" --data-binary "@accounts.json"
  3. 然后在Kibana中执行命令:GET /_cat/indices,可以看到有mybank的文档

开始查找

我们完成上面导入数据操作后,就可以试着通过_search端点查询数据。例如:

GET /mybank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

上面的从mybank总索引所有文档,并将其按照account_number升序排序,执行后得到的结果如下:

{
  "took" : 23,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1000,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "mybank",
        "_type" : "_doc",
        "_id" : "0",
        "_score" : null,
        "_source" : {
          "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"
        },
        "sort" : [
          0
        ]
      },...]
  }
}

返回信息,相关字段解释:

  • took - es查询所需的时间,单位是毫秒(milliseconds)
  • timed_out - 搜索请求是否超时
  • _shards - 搜索了多少个分片(total),以及成功(successful),失败(failed)或跳过(skipped)了多少个分片
  • max_score - 最相关文件的分数
  • hits.total.value - 找到多少相关文档
  • hits.sort - 文档的排序位置(不按相关性得分排序时)
  • hits._score - 文档的相关性得分(使用match_all时不适用)

es每次请求相互独立,不会维护相关状态信息,如果要分页搜索,请使用fromsize参数,如下:

GET /mybank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ],
  "from": 10,
  "size": 10
}

我们现在了解基本的查询结构,可以做一些其他的查询。比如,在字段中搜索特定词,可以用match搜索,查找address中包含mill或者lane的文档,案例如下:

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

如果,只想查包含mill lane的文档,可以使用match_phrase查询,如下:

GET /mybank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

为了构造更加复杂的查询,需要使用bool查询控制数据范围。可以根据可以根据需要(必须匹配),期望(应该匹配)或不期望(必须不匹配)指定条件,案例如下:

GET /mybank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID"  } }
      ]
      
    }
  }
}

以上查询的是,包含所有age=40,并且state=ID的文档。布尔查询中每个should mustnot_must被视为查询子句,mustshould的查询会提高文档的相关性分数,分数越高,文档越匹配查询。默认,es返回按这些相关性分数排名的文档。

must_not条件被视为过滤器,它只影响结果是否在文件中,但不会影响文件的评分方式。还可以显式指定任意过滤器以包含或排除文档,如下:

GET /mybank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

以上请求使用范围过滤器将结果限制为余额在20,000美元到30,000美元(含)之间的帐户

使用聚合分析结果

Elasticsearch聚合使您能够获取有关搜索结果的信息,并回答诸如“德克萨斯州有多少个帐户持有人?”之类的问题。 或“田纳西州的平均帐户余额是多少?” 您可以在一个请求中搜索文档,过滤命中并使用汇总分析结果。

例如,以下请求将银行索引中的所有帐户按状态分组,并以降序返回帐户数量最多的十个州:

GET /mybank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

返回结果如下:

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
     "total" : {
        "value": 1000,
        "relation": "eq"
     },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770,
      "buckets" : [ {
        "key" : "ID",
        "doc_count" : 27
      }, {
        "key" : "TX",
        "doc_count" : 27
      }, {
        "key" : "AL",
        "doc_count" : 25
      }, {
        "key" : "MD",
        "doc_count" : 25
      }, {
        "key" : "TN",
        "doc_count" : 23
      }, {
        "key" : "MA",
        "doc_count" : 21
      }, {
        "key" : "NC",
        "doc_count" : 21
      }, {
        "key" : "ND",
        "doc_count" : 21
      }, {
        "key" : "ME",
        "doc_count" : 20
      }, {
        "key" : "MO",
        "doc_count" : 20
      } ]
    }
  }
}

上面buckets存储的是state字段的值,doc_state显示每个state下的值,例如你可以看到有27个账户在state=ID条件下。由于size=0,所以查询结果只包含聚合结果。

总而言之,你可以利用聚合来对每次查询结果进行一个数据聚合分析。