专栏首页vblogElasticSearch7.8.0Docker安装及入门最基本操作

ElasticSearch7.8.0Docker安装及入门最基本操作

Docker 安装 ElasticSearch

拉取镜像
# 最新版本7,8.0
docker pull elasticsearch:7.8.0
启动集群
# 基本启动命令
# -e "discovery.type=single-node" \  单节点集群
# -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ 制定运行参数,不然如果机器内存太小,启动后会非常卡顿
# --name 起个别名
docker run -p 9200:9200 -p 9300:9300 --name es7.8 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-d elasticsearch:7.8.0

# 查看集群健康状态
GET /_cat/health?v
# 查看节点健康状态
GET /_cat/nodes?v
# 查看索引信息
GET /_cat/indices?v
进入容器
# 进入容器中
docker exec -it es7.8 /bin/bash
# 查看文件夹及权限
[root@87e29ba6ef1e elasticsearch]# ll
total 588
-rw-r--r--  1 elasticsearch root  13675 Jun 14 19:34 LICENSE.txt
-rw-r--r--  1 elasticsearch root 544318 Jun 14 19:37 NOTICE.txt
-rw-r--r--  1 elasticsearch root   8165 Jun 14 19:34 README.asciidoc
drwxr-xr-x  2 elasticsearch root   4096 Jun 14 19:39 bin
drwxrwxr-x  1 elasticsearch root   4096 Jul  9 04:31 config #775权限
drwxrwxr-x  3 root          root   4096 Jul  9 04:29 data #775权限
drwxr-xr-x  1 elasticsearch root   4096 Jun 14 19:38 jdk 
drwxr-xr-x  3 elasticsearch root   4096 Jun 14 19:38 lib
drwxrwxr-x  1 elasticsearch root   4096 Jul  9 04:31 logs #775权限
drwxr-xr-x 47 elasticsearch root   4096 Jun 14 19:39 modules
drwxr-xr-x  2 root          root   4096 Jul  9 04:17 plugins #775权限
可在启动容器的时候指定数据卷映射
docker run -p 9200:9200 -p 9300:9300 --name es7.8 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /dockerfile/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /dockerfile/elasticsearch/data:/usr/share/elasticsearch/data \
-v /dockerfile/elasticsearch/logs:/usr/share/elasticsearch/logs \
-d elasticsearch:7.8.0
# 做映射之前赋予文件夹相应权限,默认创建的文件夹权限就是755,所	吃   以/dockerfile/elasticsearch/plugins不用改权限
chmod -R 775 /dockerfile/elasticsearch/data
chmod -R 775 /dockerfile/elasticsearch/logs

# data和logs文件夹刚开始是空的,数据是启动时自己加进去的,所以可以做映射,
# plugins文件夹刚开始是没有安装插件的,也是空的,所以也可以做映射
# config文件夹是配置文件,不能用空目录做映射,否则启动直接退出,除非自己创建的文件夹中有相关配置文件
# 可以先进入容器,讲config文件夹拷贝出来,得到一份配置文件
-v /dockerfile/elasticsearch/config:/usr/share/elasticsearch/config \
插入一些数据
# 官方提供的account.json数据,包含1000条数据
wget https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json#
# 每个Document内容
{
    "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"
}
# 使用以下 _ bulk 批量操作请求将账户数据存储到到bank索引中:
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
# 查看索引状态
curl "localhost:9200/_cat/indices?v"
Docker 安装 Kkibana
# 拉取镜像
# kibana版本必须和elasticsearch版本保持一致
docker pull kibana:7.8.0

# 启动容器
# YOUR_ELASTICSEARCH_CONTAINER_NAME_OR_ID 正在运行的ES容器ID或name
docker run --link YOUR_ELASTICSEARCH_CONTAINER_NAME_OR_ID:elasticsearch -p 5601:5601 {docker-repo}:{version}
docker run --link es7.8:elasticsearch -p 5601:5601 -d kibana:7.8.0
安装IK分词器
# Ik分词器版本要和ES和Kibana版本保持一致

# 进入容器
docker exec -it elasticsearch /bin/bash
#此命令需要在容器中运行
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.8.0/elasticsearch-analysis-ik-7.8.0.zip
# 退出容器,重启容器
docker restart elasticsearch

索引的操作

创建索引

# 创建一个index,名为twitter
PUT /twitter
# 查看索引状态
GET /_cat/indices?v

在创建索引时,可以指定以下内容:

  • Settings for the index 索引的设置
  • Mappings for fields in the index 索引中字段的映射
  • Index aliases 索引别名

创建的每个索引都可以有特定的相关设置,在主体中定义:

PUT /twitter
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    }
}
# _ shards 的默认值是1
# _ replica 的默认值是1(即每个主碎片有一个副本)

#或者更简单,不必在设置部分中显式指定索引部分
PUT /twitter
{
    "settings" : {
        "number_of_shards" : 3,
        "number_of_replicas" : 2
    }
}

创建索引 API 允许提供一个映射定义,映射定义用于包含类型名称

PUT /test
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "properties" : {
            "field1" : { "type" : "text" } 
        }
    }
}

删除索引

DELETE /twitter
# 查看索引状态
GET /_cat/indices?v

查看索引

GET /twitter

文档的操作

查询文档

查看文档类型
GET /bank/_mapping
使用 match_all查询全部
# 查询索引bank中的全部文档
GET /bank/_search
{
  "query": { "match_all": {} }
}
使用sort指定排序规则,默认按匹配度(得分score)排序
# 检索银行索引中的所有文档,按account_number字段排序 asc 是升序,desc是降序
GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

# 查找指定范围的文档
# 下面的请求会得到从第10条文档到第19条文档的结果:
GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ],
  "from": 10,  # 起始位置
  "size": 10   # 大小/数目
}

# 默认情况下,响应的命中部分hits包含与搜索条件匹配的前10个文档:
# took – 运行查询需要多长时间(毫秒)
# timed_out – 搜寻请求是否超时
# _shards – 搜索了多少碎片,并分别列出成功、失败或跳过的碎片数量,创建索引时默认分片数是5
# max_score – 找到的所有文档中最相关文档(匹配程度最高)的分数
# hits.total.value - 找到多少相符的文档
# hits.sort -  文档的排序位置(按哪个字段排序,不指定排序规则时按相关性得分排序)
# hits._score -  文件的相关性得分(不适用于使用match_all)
{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {                        # 命中部分
    "total" : {
        "value": 1000,              # 查到的总数
        "relation": "eq"
    },
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "0",
      "sort": [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"}
    }, {
      "_index" : "bank",
      "_type" : "_doc",
      "_id" : "1",
      "sort": [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"}
    }, ...
    ]
  }
}

# 搜索并返回指定字段内容,使用_source表示,例如只返回account_number和balance两个字段内容:
GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}
使用match,单词查询
# 会查出字所有文档中,address字段包含 mill 【或者】 lane 的文档
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill lane"
    }
  }
}
# 对于数值类型match操作使用的是精确匹配,对于文本类型使用的是模糊匹配;
使用match_phrase,短语搜索
# 只会查出字所有文档中,address字段包含 "mill lane" 的文档
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}
bool 组合多个查询条件
  • must match 必须匹配
  • should match 应该匹配(一般用于组合 或 关系)
  • must not 必须不满足,相当于排序filter
  • 布尔查询中的每个 must、 should 和 must _ not 元素都称为查询子句。文档满足每个 必须或应该条款 中的标准的程度决定了文档的相关性得分。得分越高,文档就越符合你的搜索条件。默认情况下,Elasticsearch 返回按照相关性得分排序后的文档。
# 在bank索引中搜索40岁客户(age=40)的账户,但不包括住在爱达荷州的任何人,州名是ID (state=ID):
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}
# 还可以借助 must_not 显示地指定筛选条件
# 使用范围过滤器filter将结果限制为余额(balance字段)在 $20,000和 $30,000之间的帐户。
# gte是大于等于,gt是大于;lte是小于等于,lt是小于
GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

# should表示满足其中任意一个,搜索address字段中包含mill或者lane的文档;
GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}
term精确值查找

term 查询, 可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text,不推荐)。

term 查询会查找我们指定的精确值。作为其本身, term 查询是简单的。它接受一个字段名以及我们希望查找的数值:

{
    "term" : {
        "price" : 20
    }
}

通常当查找一个精确值的时候,我们不希望对查询进行评分计算。只希望对文档进行包括或排除的计算,所以我们会使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分。

最终组合的结果是一个 constant_score 查询,它包含一个 term 查询:

GET /bank/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "age": {
            "value": 20
          }
        }
      }
    }
  }
}

默认情况下,Elasticsearch 作为分析的一部分更改text类型字段的值。这可能使查找文本字段值的精确匹配变得困难。若要搜索文本字段值,请使用match查询。

默认情况下,Elasticsearch 会在分析期间更改文本字段的值。例如,默认的标准分析器更改文本字段值如下:

  • Removes most punctuation 删除大部分标点符号
  • Divides the remaining content into individual words 将剩下的内容分成单独的单词,称为tokens
  • Lowercases the tokens 小写tokens
# 创建一个名为my_index的索引,其中 full _ text 字段为文本类型。
PUT my_index
{
    "mappings" : {
        "properties" : {
            "full_text" : { "type" : "text" }
        }
    }
}
# 在插入一个值为 Quick Brown Foxes! 的文档。
PUT my_index/_doc/1
{
  "full_text":   "Quick Brown Foxes!"
}
# 因为full_text字段是一个文本字段,Elasticsearch 在分析期间将 Quick Brown Foxes! 更改为[ Quick,Brown,fox ]。
# 使用term搜索这条文档
GET my_index/_search?pretty
{
  "query": {
    "term": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}
# 因为full_text字段不再包含确切的术语 Quick BrwnFoxes! ,术语查询搜索不返回任何结果。

增加文档

# 指定索引customer,指定id,可选,若不指定则随机生成,_doc是默认参数,可不写
PUT /bank/_doc/1
{
  "email": "test@test.com"
}

修改文档

POST /< index >/_ update/< _ id >

,目标索引的名称。默认情况下,如果索引不存在,则自动创建索引。

<_id> 必需,字符串,文档更新的唯一标识符

# 指定索引test,指定id,可选,若不指定则随机生成,_doc是默认参数,可不写
# 插入一条文档
PUT /test/_doc/1
{
    "age" : 10
}
# 查看
GET /test/_doc/1
# 修改
POST /test/_update/1
{
  "doc" :{
    "age":"20"
  }
}
# 查看
GET /test/_doc/1

删除文档

DELETE /<index>/_doc/<_id>
# 删除bank索引中id为1的文档
DELETE /bank/_doc/1

PS

我的博客即将同步至腾讯云+社区,邀请大家一同入驻

https://cloud.tencent.com/developer/support-plan?invite_code=2od2cppsrkao8

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简单公司职员信息管理系统

    vivi
  • PAT 1021 Deepest Root (25分) 从测试点3超时到满分再到代码优化

    A graph which is connected and acyclic can be considered a tree. The height of t...

    vivi
  • PAT1050 String Subtraction (20分) 用布尔数组

    Given two strings S​1​​ and S​2​​ , S=S​1​​ −S​2​​ is defined to be the remainin...

    vivi
  • 搞它!!!2020年了你还不会Cobbler自动装机么(装机步骤,优化内容详解,导入系统镜像步骤,cobbler-web管理认证方式

    Cobbler是一个使用Python开发的开源项目,通过将部署系统所涉及的所有服务集中在一起,来提供一个全自动批量快速建立Linux系统的网络安装环境 Cob...

    不吃小白菜
  • ElasticSearch 使用笔记1 安装与基本概念

    当前全文搜索需求日益增长,ElasticSearch作为一款开源的全文检索引擎,是当前许多大公司如WikiPedia、Github、Stack Overflow...

    村雨遥
  • IntelliJ IDEA 2019 从入门到上瘾 图文教程!

    如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了。

    Lemon黄
  • IntelliJ IDEA 从入门到上瘾教程,2019图文版!

    如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了。

    Java团长
  • IntelliJ IDEA 2019从入门到上瘾 图文教程

    如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了。

    用户1516716
  • IntelliJ IDEA 从入门到上瘾教程,2019图文版!

    如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了。

    帅地
  • IntelliJ IDEA 真香教程

    如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了。

    一个优秀的废人

扫码关注云+社区

领取腾讯云代金券