ElasticSearch6.X操作指南(一)

0.入门

简单安装

下载对应版本的软件包后

cd elasticsearch-
./bin/elasticticsearch
  • 如果你想把 Elasticsearch 作为一个守护进程在后台运行,那么可以在后面添加参数 -d
  • 如果你是在 Windows 上面运行 Elasticseach,你应该运行 bin\elasticsearch.bat 而不是 bin\elasticsearch 。
  • 测试 Elasticsearch 是否启动成功,可以打开另一个终端,执行以下操作:
curl 'http://localhost:9200/?pretty'

或浏览器打开

http://localhost:9200/?pretty

结果如下

{
  "name" : "9333T0D",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "zHPKwfphSmqah0eNiRiH1Q",
  "version" : {
    "number" : "6.2.2",
    "build_hash" : "10b1edd",
    "build_date" : "2018-02-16T19:01:30.685723Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

1.索引

对象说明

索引(数据库)→类型(表)→文档(行)→属性(字段)

创建一个索引

curl -XPUT 'localhost:9200/megacorp?pretty'

curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp?pretty'(5.5以后版本)

返回信息

{
  "acknowledged" : true,
  "shards_acknowledged" : true
}

列出所有索引

API:_cat
curl -XGET -H 'Content-Type: application/json' 'localhost:9200/_cat/indices?v'

返回信息

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open customer SRKYMKC1SVSTfCOSAbGqzQ 5 1 6 0 20.3kb 20.3kb

v:显示列头

删除索引

curl -XDELETE 'localhost:9200/megacorp?pretty'

返回信息

{
  "acknowledged" : true
}

2.类型和文档

创建文档

curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/1' -d '
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}'
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/2' -d '
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}'
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/3' -d '
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}'

显式创建文档

curl -XPUT  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4?op_type=create'  -d '
{
    "first_name" :  "Jack",
    "last_name" :   "Kobe",
    "age" :         44,
    "about":        "I like to play basketball",
    "interests":  [ "sport" ]
}'

或者

curl -XPUT  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4/_create'  -d '
{
    "first_name" :  "Jack",
    "last_name" :   "Kobe",
    "age" :         44,
    "about":        "I like to play basketball",
    "interests":  [ "sport" ]
}'

创建成功状态码是201,已存在的状态码是409

索引数据后的返回返回信息

{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no":0
  "_primary_term":1
}
  • 创建文档时:_index 、 _type 和 _id 的组合可以唯一标识一个文档。
  • 文档的元数据说明
    _index:文档在哪存放
    _type:文档表示的对象类别
    _id:文档唯一标识
    _version:版本号;当每次对文档进行修改时(包括删除), _version 的值会递增;处理冲突时也会用到。
    自动生成ID:请求的结构调整为: 不再使用 PUT 谓词(“使用这个 URL 存储这个文档”), 而是使用 POST 谓词(“存储文档在这个 URL 命名空间下”)。

检索文档

普通检索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1'

轻量检索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search'

检索部分内容

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1?_source=first_name,last_name'

只得到source的内容

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1?_source'

按条件搜索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?q=last_name:Smith'

*q=表示匹配全部文档

sort=age表示按照age信息排序

asc表示升序

可以不加参数,查询全部文档

curl -XGET 'localhost:9200/megacorp/_search?pretty'

返回信息说明

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : null,
    "hits" : [
      {
        "_index" : "customer",
        "_type" : "external",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "name" : "Zhao1"
        },
        "sort" : [
          9223372036854775807
        ]
      }
    ]
  }
}

使用检索表达式

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}'

复杂检索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}'

批量检索(multi-get 或者 mget API)

mget API 要求有一个 docs 数组作为参数,每个 元素包含需要检索文档的元数据, 包括 _index 、 _type 和 _id 。如果你想检索一个或者多个特定的字段,那么你可以通过 _source 参数来指定这些字段的名字:

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_mget?pretty' -d '
{
   "docs" : [
      {
         "_index" : "megacorp",
         "_type" :  "employee",
         "_id" :    2
      },
      {
         "_index" : "megacorp",
         "_type" :  "employee",
         "_id" :    1
      }
   ]
}'

如果想检索的数据都在相同的 _index 中(甚至相同的 _type 中),则可以在 URL 中指定默认的 /_index 或者默认的 /_index/_type 。

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/_mget' -d '
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "employee", "_id" : 1 }
   ]
}'

也可以用ids来检索数据

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/_mget' -d '
{
   "ids" : [ "2", "1" ]
}'

全文检索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

短语检索

我们想执行这样一个查询,仅匹配同时包含 “rock” 和 “climbing” ,并且 二者以短语 “rock climbing” 的形式紧挨着的雇员记录
curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}'

高亮检索

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}'
  • took:查询消耗的毫秒数
  • timed_out:查询是否超时
  • _shards:查询了多少个分片,以及成功/失败数的统计
  • hits:查询结果
  • hits.total:符合条件的文档总数
  • hits.hits:存储搜索结果的实际数据(默认显示前10个文档)
  • sort:排序关键字(如果查询时未制定,默认使用score信息)
  • _score:

更新一个文档

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/2/_update' -d '
{
  "script" : "ctx._source.age += 5"
}'
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/megacorp/employee/2/_update' -d '
{
  "doc": { "first_name": "Jane Li" }
}'

合并修改

curl -XPOST  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1/_update'  -d '
{
   "script" : "ctx._source.tags+=new_tag",
   "params" : {
      "new_tag" : "search"
   }
}'

要更新的数据不存在时,就创建

curl -XPOST  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1/_update'  -d '
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 1
   }
}'

当因为版本号,并发更新失败时可以重试(retry_on_conflict 设置重试次数)

curl -XPOST  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/1/_update?retry_on_conflict=5'  -d '
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 0
   }
}'

乐观锁问题

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/2?version=5&version_type=external'

文档是否存在

curl  -i -XHEAD  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4'

删除文档

curl -XDELETE  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/4'

成功返回200,找不到是404,version会加1(即使文档不存在(Found 是 false),_version 值仍然会增加。这是 Elasticsearch 内部记录本的一部分,用来确保这些改变在跨多节点时以正确的顺序执行)

删除全部文档

curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_delete_by_query?conflicts=proceed' -d '
{
  "query": {
    "match_all": {}
  }
}'

批量操作(bulk)

与 mget 可以使我们一次取回多个文档同样的方式, bulk API 允许在单个步骤中进行多次 create 、 index 、 update 或 delete 请求。 如果你需要索引一个数据流比如日志事件,它可以排队和索引数百或数千批次。

格式说明:
这种格式类似一个有效的单行 JSON 文档 流 ,它通过换行符(\n)连接到一起。注意两个要点:
每行一定要以换行符(\n)结尾, 包括最后一行 。这些换行符被用作一个标记,可以有效分隔行。
这些行不能包含未转义的换行符,因为他们将会对解析造成干扰。这意味着这个 JSON 不 能使用 pretty 参数打印。

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

action/metadata:指定哪一个文档做什么操作。
action:必须是以下选项之一

create:如果文档不存在,那么就创建它。

index:创建一个新文档或者替换一个现有的文档。

update:部分更新一个文档。

delete“删除一个文档。

metadata 应该 指定被索引、创建、更新或者删除的文档的 _index 、 _type 和 _id 。

curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/_mget?pretty' -d '
{ "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", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
'

delete后面不需要请求体,最后一行也要有换行

每个子请求都是独立执行,因此某个子请求的失败不会对其他子请求的成功与否造成影响。 如果其中任何子请求失败,最顶层的 error 标志被设置为 true ,并且在相应的请求报告出错误明细。

3.聚合与分析

分析:先开启fielddata

curl -XPUT  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/_mapping/employee?pretty'  -d '
{
  "properties": {
    "interests": { 
      "type":     "text",
      "fielddata": true
    }
  }
}'

分析-执行查询

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}'

分析-加入查询条件

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}'

分析-分级汇总

curl -XGET  -H 'Content-Type: application/json' 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}'

你可能感兴趣的:(大数据生态)