txzmy

1. ELASTICSEARCH

1、安装elastic search

dokcer中安装elastic search

(1)下载ealastic search和kibana

docker pull elasticsearch:7.6.2
docker pull kibana:7.6.2

(2)配置

mkdir -p /mydata/elasticsearch/config  创建目录
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml

//将mydata/elasticsearch/文件夹中文件都可读可写
chmod -R 777 /mydata/elasticsearch/

 

(3)启动Elastic search

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.6.2

设置开机启动elasticsearch

docker update elasticsearch --restart=always

 

(4)启动kibana:

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.6.128:9200 -p 5601:5601 -d kibana:7.6.2

设置开机启动kibana

docker update kibana  --restart=always

 

 

(5)测试

查看elasticsearch版本信息: http://192.168.6.128:9200/

{
   "name": "0adeb7852e00",
   "cluster_name": "elasticsearch",
   "cluster_uuid": "9gglpP0HTfyOTRAaSe2rIg",
   "version": {
       "number": "7.6.2",
       "build_flavor": "default",
       "build_type": "docker",
       "build_hash": "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
       "build_date": "2020-03-26T06:34:37.794943Z",
       "build_snapshot": false,
       "lucene_version": "8.4.0",
       "minimum_wire_compatibility_version": "6.8.0",
       "minimum_index_compatibility_version": "6.0.0-beta1"
  },
   "tagline": "You Know, for Search"
}

 

显示elasticsearch 节点信息http://192.168.6.128:9200/_cat/nodes

127.0.0.1 76 95 1 0.26 1.40 1.22 dilm * 0adeb7852e00

 

访问Kibana: http://192.168.6.128:5601/app/kibana

 

 

 

2、初步检索

1)_CAT

(1)GET/cat/nodes:查看所有节点

如:http://192.168.6.128:9200/_cat/nodes :

127.0.0.1 61 91 11 0.08 0.49 0.87 dilm * 0adeb7852e00

注:*表示集群中的主节点

(2)GET/cat/health:查看es健康状况

如:http://192.168.6.128:9200/_cat/health

1588332616 11:30:16 elasticsearch green 1 1 3 3 0 0 0 0 - 100.0%

注:green表示健康值正常

(3)GET/cat/master:查看主节点信息

如: http://192.168.6.128:9200/_cat/master

vfpgxbusTC6-W3C2Np31EQ 127.0.0.1 127.0.0.1 0adeb7852e00

(4)GET/_cat/indicies:查看所有索引 ,等价于mysql数据库的show databases;

如: http://192.168.6.128:9200/_cat/indices

green open .kibana_task_manager_1   KWLtjcKRRuaV9so_v15WYg 1 0 2 0 39.8kb 39.8kb
green open .apm-agent-configuration cuwCpJ5ER0OYsSgAJ7bVYA 1 0 0 0 283b 283b
green open .kibana_1 PqK_LdUYRpWMy4fK0tMSPw 1 0 7 0 31.2kb 31.2kb

2)索引一个文档

保存一个数据,保存在哪个索引的哪个类型下,指定用那个唯一标识 PUT customer/external/1;在customer索引下的external类型下保存1号数据为

PUT customer/external/1

 

{
"name":"John Doe"
}

PUT和POST都可以 POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号; PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。

 

下面是在postman中的测试数据:

 

 

创建数据成功后,显示201 created表示插入记录成功。

{
   "_index": "customer",
   "_type": "external",
   "_id": "1",
   "_version": 1,
   "result": "created",
   "_shards": {
       "total": 2,
       "successful": 1,
       "failed": 0
  },
   "_seq_no": 0,
   "_primary_term": 1
}

这些返回的JSON串的含义;这些带有下划线开头的,称为元数据,反映了当前的基本信息。

"_index": "customer" 表明该数据在哪个数据库下;

"_type": "external" 表明该数据在哪个类型下;

"_id": "1" 表明被保存数据的id;

"_version": 1, 被保存数据的版本

"result": "created" 这里是创建了一条数据,如果重新put一条数据,则该状态会变为updated,并且版本号也会发生变化。

 

下面选用POST方式:

添加数据的时候,不指定ID,会自动的生成id,并且类型是新增:

 

 

再次使用POST插入数据,仍然是新增的:

 

 

 

添加数据的时候,指定ID,会使用该id,并且类型是新增:

 

 

再次使用POST插入数据,类型为updated

 

 

 

3)查看文档

GET /customer/external/1

http://192.168.6.128:9200/customer/external/1

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

 

 

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

实例:将id=1的数据更新为name=1,然后再次更新为name=2,起始seq_no=6,primary_term=1

(1)将name更新为1

http://192.168.6.128:9200/customer/external/1?if_seq_no=1&if_primary_term=1

 

 

(2)将name更新为2,更新过程中使用seq_no=6

http://192.168.6.128:9200/customer/external/1?if_seq_no=6&if_primary_term=1

 

 

出现更新错误。

 

(3)查询新的数据

http://192.168.6.128:9200/customer/external/1

 

 

能够看到_seq_no变为7。

(4)再次更新,更新成功

http://192.168.6.128:9200/customer/external/1?if_seq_no=7&if_primary_term=1

 

 

4)更新文档

 

 

 

 

(1)POST更新文档,带有_update

http://192.168.6.128:9200/customer/external/1/_update

 

 

如果再次执行更新,则不执行任何操作,序列号也不发生变化

 

 

POST更新方式,会对比原来的数据,和原来的相同,则不执行任何操作(version和_seq_no)都不变。

(2)POST更新文档,不带_update

 

 

在更新过程中,重复执行更新操作,数据也能够更新成功,不会和原来的数据进行对比。

5)删除文档或索引

DELETE customer/external/1
DELETE customer

注:elasticsearch并没有提供删除类型的操作,只提供了删除索引和文档的操作。

 

实例:删除id=1的数据,删除后继续查询

 

 

实例:删除整个costomer索引数据

删除前,所有的索引

green  open .kibana_task_manager_1   KWLtjcKRRuaV9so_v15WYg 1 0 2 0 39.8kb 39.8kb
green open .apm-agent-configuration cuwCpJ5ER0OYsSgAJ7bVYA 1 0 0 0 283b 283b
green open .kibana_1 PqK_LdUYRpWMy4fK0tMSPw 1 0 7 0 31.2kb 31.2kb
yellow open customer nzDYCdnvQjSsapJrAIT8Zw 1 1 4 0 4.4kb 4.4kb

删除“ customer ”索引

 

 

删除后,所有的索引

green  open .kibana_task_manager_1   KWLtjcKRRuaV9so_v15WYg 1 0 2 0 39.8kb 39.8kb
green open .apm-agent-configuration cuwCpJ5ER0OYsSgAJ7bVYA 1 0 0 0 283b 283b
green open .kibana_1 PqK_LdUYRpWMy4fK0tMSPw 1 0 7 0 31.2kb 31.2kb

 

6)eleasticsearch的批量操作——bulk

语法格式:

{action:{metadata}}\n   //例如index保存记录,update更新
{request body }\n

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

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

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

实例1: 执行多条数据 (postman 报错,在kibana中的Dev_tools中执行)

POST /customer/external/_bulk
{"index":{"_id":"1"}}
{"name":"John Doe"}
{"index":{"_id":"2"}}
{"name":"John Doe"}

执行结果

#! Deprecation: [types removal] Specifying types in bulk requests is deprecated.
{
"took" : 491,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 201
}
},
{
"index" : {
"_index" : "customer",
"_type" : "external",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1,
"status" : 201
}
}
]
}

 

实例2:对于整个索引执行批量操作

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"}}

运行结果:

#! Deprecation: [types removal] Specifying types in bulk requests is deprecated.
{
 "took" : 608,
 "errors" : false,
 "items" : [
  {
     "delete" : {
       "_index" : "website",
       "_type" : "blog",
       "_id" : "123",
       "_version" : 1,
       "result" : "not_found",
       "_shards" : {
         "total" : 2,
         "successful" : 1,
         "failed" : 0
      },
       "_seq_no" : 0,
       "_primary_term" : 1,
       "status" : 404
    }
  },
  {
     "create" : {
       "_index" : "website",
       "_type" : "blog",
       "_id" : "123",
       "_version" : 2,
       "result" : "created",
       "_shards" : {
         "total" : 2,
         "successful" : 1,
         "failed" : 0
      },
       "_seq_no" : 1,
       "_primary_term" : 1,
       "status" : 201
    }
  },
  {
     "index" : {
       "_index" : "website",
       "_type" : "blog",
       "_id" : "MCOs0HEBHYK_MJXUyYIz",
       "_version" : 1,
       "result" : "created",
       "_shards" : {
         "total" : 2,
         "successful" : 1,
         "failed" : 0
      },
       "_seq_no" : 2,
       "_primary_term" : 1,
       "status" : 201
    }
  },
  {
     "update" : {
       "_index" : "website",
       "_type" : "blog",
       "_id" : "123",
       "_version" : 3,
       "result" : "updated",
       "_shards" : {
         "total" : 2,
         "successful" : 1,
         "failed" : 0
      },
       "_seq_no" : 3,
       "_primary_term" : 1,
       "status" : 200
    }
  }
]
}

 

7)样本测试数据

准备了一份顾客银行账户信息的虚构的JSON文档样本。每个文档都有下列的schema(模式)。

{
"account_number": 1,
"balance": 39225,
"firstname": "Amber",
"lastname": "Duke",
"age": 32,
"gender": "M",
"address": "880 Holmes Lane",
"employer": "Pyrami",
"email": "amberduke@pyrami.com",
"city": "Brogan",
"state": "IL"
}

https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json?raw=true ,导入测试数据,

POST bank/account/_bulk

 

3、检索

1)search Api

ES支持两种基本方式检索;

  • 通过REST request uri 发送搜索参数 (uri +检索参数);

  • 通过REST request body 来发送它们(uri+请求体);

信息检索

 

 

 

 

 

 

 

 

uri+请求体进行检索

GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" },
{"balance":"desc"}
]
}

 

HTTP客户端工具(),get请求不能够携带请求体,

 

GET bank/_search?q=*&sort=account_number:asc
//q=* 查询所有,sort=account_number:asc 按照account_number进行asc升序排列sort

返回结果:

{
 "took" : 235,
 "timed_out" : false,
 "_shards" : {
   "total" : 1,
   "successful" : 1,
   "skipped" : 0,
   "failed" : 0
},
 "hits" : {
   "total" : {
     "value" : 1000,
     "relation" : "eq"
  },
   "max_score" : null,
   "hits" : [
    {
       "_index" : "bank",
       "_type" : "account",
       "_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
      ]
    },
    {
       "_index" : "bank",
       "_type" : "account",
       "_id" : "1",
       "_score" : null,
       "_source" : {
         "account_number" : 1,
         "balance" : 39225,
         "firstname" : "Amber",
         "lastname" : "Duke",
         "age" : 32,
         "gender" : "M",
         "address" : "880 Holmes Lane",
         "employer" : "Pyrami",
         "email" : "amberduke@pyrami.com",
         "city" : "Brogan",
         "state" : "IL"
      },
       "sort" : [
         1
      ]
    },
    {
       "_index" : "bank",
       "_type" : "account",
       "_id" : "2",
       "_score" : null,
       "_source" : {
         "account_number" : 2,
         "balance" : 28838,
         "firstname" : "Roberta",
         "lastname" : "Bender",
         "age" : 22,
         "gender" : "F",
         "address" : "560 Kingsway Place",
         "employer" : "Chillium",
         "email" : "robertabender@chillium.com",
         "city" : "Bennett",
         "state" : "LA"
      },
       "sort" : [
         2
      ]
    },
    {
       "_index" : "bank",
       "_type" : "account",
       "_id" : "3",
       "_score" : null,
       "_source" : {
         "account_number" : 3,
         "balance" : 44947,
         "firstname" : "Levine",
         "lastname" : "Burks",
         "age" : 26,
         "gender" : "F",
         "address" : "328 Wilson Avenue",
         "employer" : "Amtap",
         "email" : "levineburks@amtap.com",

分类:

技术点:

相关文章: