使用docker搭建es环境并简单使用

48 篇文章 2 订阅
28 篇文章 2 订阅

1 引言

对某个字段进行全文检索,这时候就要使用到es,也就是elasticsearch,配合kibana进行数据可视化。
也可以用作elk日志分析系统。

2 搭建es环境(docker 单机)

2.1 安装es和kibana

安装最新版本的es

version: '3'
services:
  elasticsearch:
    restart: always
    image: elasticsearch:7.14.0
    container_name: elasticsearch
    ports:
      - 8060:9200
    volumes:
      - ./elasticsearch/plugins/elasticsearch-analysis-ik:/usr/share/elasticsearch/plugins/elasticsearch-analysis-ik # 分词器
      - ./elasticsearch/data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node # 单节点
      #- xpack.security.enabled=ture# 启动安全(需要配置密码),不启动能用但是日志一直抛错
  kibana:
    restart: always
    image: kibana:7.14.0
    container_name: kibana
    ports:
      - 8061:5601
    environment:
      # docker-compose提供的功能 使其可以访问其他容器内部 elasticsearch_url=http://elasticsearch:9200 
      - elasticsearch_url=http://127.0.0.1:8060 # 需要连接es的设置
    depends_on: # 取决于
      - elasticsearch # 监听es                            

安装指定版本的es

version: '3'
services:
  elasticsearch:
    restart: always
    image: daocloud.io/library/elasticsearch:6.5.4
    container_name: elasticsearch
    ports:
      - 8060:9200
    volumes:
      - ./elasticsearch/plugins/elasticsearch-analysis-ik:/usr/share/elasticsearch/plugins/elasticsearch-analysis-ik
      - ./elasticsearch/data:/usr/share/elasticsearch/data
  kibana:
    restart: always
    image: daocloud.io/library/kibana:6.5.4
    container_name: kibana
    ports:
      - 8061:5601
    environment:
      # docker-compose提供的功能 使其可以访问其他容器内部 elasticsearch_url=http://elasticsearch:9200 
      - elasticsearch_url=http://127.0.0.1:8060
    depends_on:
      - elasticsearch

2.2 注意事项

  • 需要安装ik中文分析器,下载完解压到elasticsearch-analysis-ik目录下即可
  • es7.x已经没有类型选择,统一为_doc
  • 在kibana.yml配置文件中添加一行配置(高版本适用)
    i18n.locale: “zh-CN”
  • keyword类型的字段长度是32766,而text类型是没有长度限制一说。
    keyword类型的最大支持的长度为——32766个UTF-8类型的字符。也就是说term精确匹配的最大支持的长度为32766个UTF-8个字符。
    设置ignore_above后,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。也就是说ignore_above的参数的上线是32766
    一般text和keyword类型共存共用。

2.3 es常见报错

docker-compose logs elasticsearch查看日志:
报错:java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes/0
原因:其实并不是es容器里的/usr/share/elasticsearch/data/nodes文件夹目录没有读写权限,实际是挂载的目录没有读写权限。
给予宿主机目录权限:[sudo] chmod 777 data

ElasticSearch启动报错,bootstrap checks failed
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
最大虚拟内存面积vm.max\u映射\u计数[65530]太低,至少增加到[262144]
编辑 /etc/sysctl.conf,追加以下内容:
vm.max_map_count=655360
保存后,执行:
sysctl -p
重新启动,成功。

2.4 Elasticsearch分片达到文档数量上限

es的shard对应lucene的index,一个index只能存储20亿个文档,5个分片大概100亿文档,达到了单个索引的文档数上限。

问题原因:

ES 的每个分片(shard)都是lucene的一个index,而lucene的一个index只能存储20亿个文档,所以一个分片也只能最多存储20亿个文档。

解决办法:

直接删除日志索引,Fluentd会自动创建新的日志索引,新的日志数据就成功写入了。

3 es的Restful Api


# 删除索引
DELETE /localdeployment-server

# 新建doc索引 类型news 指定数据结构
# 默认5 1 单机下不生效 集群才生效
#  "settings": {
#    "number_of_shards": 5,
#    "number_of_replicas": 1
#  },
PUT /doc
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "news":{
      "properties":{
        "name":{
          "type":"keyword"
        },
        "desc":{
          "type":"text",
          "analyzer":"ik_max_word"
        },
        "text":{
          "type":"text",
          "analyzer":"ik_max_word",
          "index":true,
          "store":false
        },
        "create_time":{
          "type":"date",
          "format":"yyyy-MM-dd HH:mm:ss"
        }
      }
    }
  }
}

POST /doc/news
{
  "name":"早间新闻",
  "desc":"这是早间新闻摘要",
  "text":"这是早间新闻内容",
  "create_time":"2021-8-6 11:28:00"
}

# term查询
POST /doc/news/_search
{ 
  "from":0,
  "size":5,
  "query":{
    "match": {
      "desc": "早间新闻"
    }
  }
}

POST /doc/news/_search
{ 
  "query":{
    "match_all": {}
  }
}


POST /localdeployment-server/doc/_search
{ 
  "query":{
    "term": {
      "content":"数据库"
     }
  },
  "highlight": {
    "fields": {
      "content": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 50
  }
}




POST /localdeployment-server/doc
{"fileName":"初心砥柱天地间.txt","transFilePath":"F:\\uploadFile\\documentTransFiles\\2021\\08\\03\\1627974320361_中文-英语_1627974320389_translation.txt","contrastTransFilePath":"F:\\uploadFile\\documentTransFiles\\2021\\08\\03\\1627974320361_中文-英语_1627974320389_contrast.txt","userId":2,"content":"40多","createTime":1627974320000,"id":2474,"fileType":"txt"}




POST /localdeployment-server/doc/_search
{
  "query": {
    "match": {
      "content": "博客",
      "fileName": "新建文本文档 (2).txt"
    }
  }
}

# 先找到符合的数量
POST /localdeployment-server/doc/_search
{
"aggs": {
    "agg": {
      "date_range": {
        "field": "createTime",
        "format": "yyyy", 
        "ranges": [
          {
            "from": "2020",
            "to": "2022"
          }
        ]
      }
    }
  } 
}

# must []存放不同的查询 ps:size在java中设定
POST /localdeployment-server/doc/_search
{
  "from": 0,
  "size": 1000,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fileType": "文件类型15"
          }
        },
        {
          "match": {
            "content": "MySQL"
          }
        },
        {
          "match": {
            "userId": "15"
          }
        },
        {
          "range": {
            "createTime": {
              "gte": "2020 10",
              "lte": "2021 10",
              "format": "yyyy MM"
            }
          }
        }
      ]
    }
  },
  
  "highlight": {
    "fields": {
      "content": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 100
  }
}

# 根据文件id去删除
POST /localdeployment-server/doc/_delete_by_query
{
  "query":{
    "match":{
      "userId":15
    }
  }
}

4 Elasticsearch中如何进行日期(数值)范围查询

参考这个文章,写的很详细:https://www.cnblogs.com/shoufeng/p/11266136.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L-960

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值