ElasticSearch学习笔记(持续更新)

282 阅读5分钟

readme

  • 发现搜索引擎很多dsl无法使用 故记下
  • 工作中遇到的问题 也同时记录于此

elasticsearch目录

  • bin-> 存放启动ES等命令脚本
  • config-> 存放ES的配置文件,ES启动时会读取其中的内容
  • elasticsearch.yml-> ES的集群信息、对外端口、内存锁定、数据目录、跨域访问等属性的配置
  • jvm.options-> ES使用Java写的,此文件用于设置JVM相关参数,如最大堆、最小堆
  • log4j2.properties-> ES使用log4j作为其日志框架
  • data-> 数据存放目录(索引数据)
  • lib-> ES依赖的库
  • logs-> 日志存放目录
  • modules-> ES的各功能模块
  • plugins-> ES的可扩展插件存放目录,如可以将ik中文分词插件放入此目录,ES启动时会自动加载

使用docker 搭建elasticsearch 和 kibana

  1. docker run --name kibana -p 5601:5601 -d -e ELASTICSEARCH_URL=http://localhost:9200 kibana:6.7.1
  2. docker run -it --name elasticsearch -d -p 9200:9200 -p 9300:9300 -p 5601:5601 elasticsearch:6.7.1
  3. docker run -it -d -e ELASTICSEARCH_URL=http://127.0.0.1:9200 --name kibana --network=container:elasticsearch kibana:6.7.1
  4. ps -ef | grep '.node/bin/node.src/cli'
  5. kill -9 PID

kibana 使用

  • Discover 查看更多关于搜索和过滤数据的信息。
  • Visualize 查看所有 Kibana 提供的可视化控件种类。
  • Management 查看如何配置 Kibana 和管理已保存的对象。
  • Console 查看如何使用交互控制台向 Elasticsearch 提交 REST 请求。

ElasticSearch 核心概念

  1. 集群 由一个或多个节点组成。一个集群有一个默认名称"Elasticsearch"。
  2. 节点
  3. Master节点:存元数据。
  4. Data节点:存数据。
  5. Ingest节点:可在数据真正进入index前,通过配置pipline拦截器对数据ETL。
  6. Coordinate节点:协调节点。如接收搜索请求,并将请求转发到数据节点,每个数据节点在本地执行请求并将结果返回给协调节点。协调节点将每个数据节点的结果汇总并返回给客户端。每个节点默认都是一个协调节点。当将node.master,node.data和node.ingest设置为false时,该节点仅用作协调节点。

注意:Coordinate Tribe 是一种特殊类型的协调节点,可连接到多个集群并在所有连接的集群中执行搜索和其他操作。

  1. 索引(index) 一个index可以理解成一个关系型数据库。
  2. 类型(type) 一种type就像一类表。如用户表、充值表等。
  3. 注意:
  4. ES 5.x中一个index可以有多种type。
  5. ES 6.x中一个index只能有一种type。
  6. ES 7.x以后,将移除type这个概念。
  7. 映射(mapping) mapping定义了每个字段的类型、字段所使用的分词器等。相当于关系型数据库中的表结构。
  8. 文档(document) 一个document相当于关系型数据库中的一行row。
  9. 字段(field) 文档中的一个字段field就相当于关系型数据库中的一列column。
  10. 分片(shard)和副本(replica)
  11. 副本是分片的副本。分片有主分片(primary Shard)和副本分片(replica Shard)之分。一个Index数据在物理上被分布在多个主分片中,每个主分片只存放部分数据。每个主分片可以有多个副本,叫副本分片,是主分片的复制。
  12. 注意:
  13. 一个document只存在于某个primary shard以及其对应的replica shard上,不会在多个primary shard上。
  14. 默认情况下,一个index有5个主分片,每个主分片都有一个副本。这样,整个index就有10个分片,要保证整个集群健康,就需要至少两个节点。因为主分片和副本分片不能在同一台机器上。
  15. 主分片的数量在创建索引后不能再被修改,副本分片的数量可以改变。
  16. 每个分片shard都是一个完整的lucene实例,有完整创建索引和处理请求的能力。
  17. 分片有助于es水平扩展。副本一般用来容错,相当于主分片的HA。除此之外,分片和副本还有助于提高并行搜索的性能,因为可以在所有副本上并行执行搜索。
  18. 分段(segment) 一个shard包含多个segment,每个segment都是倒排索引。
  19. segment查询 查询时,每个shard会把所有segment结果汇总作为shard的结果返回。
  20. segment生成
  21. 写入ES时,一方面会把数据写入到内存Buffer缓冲,为防止Buffer中数据丢失,另一方面会同时把数据写入到translog日志文件。
  22. 每隔1秒钟,数据从Buffer被写入到segment file,直接写入os cache。
  23. os cache segment file被打开供search使用,然后内存Buffer被清空。
  24. 随着时间推移,os cache中segment file越来越多,translog日志文件也越来越大,当translog日志文件大到一定程度的时候就会触发flush操作。
  25. flush操作将os cache中segment file持久化到磁盘并删除translog日志文件。
  26. 当segment增多到一定程度,会触发ES合并segment,将许多小的segment合并成大segment并删除小segment,提高查询性能。

问题

Kibana中创建索引 关于选择时间的问题。切记不要用long类型,这会导致es无法识别其类型 搭建日志系统中 创建索引时指定时间字段和类型

  1. 第一种方式
PUT localhost:9200/{date-test//这里为索引名}
{
"mappings": {
"test": {//这里为type
"properties": {
"requestTime": {//指定时间字段
"type":   "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"//指定格式
},
"timestamp": {
"type":   "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
localhost:9200/date_test/test/_mapping
  1. 根据模板创建

//todo

  1. 根据条件删除文档
http://172.25.35.230:9200/mobile-requestpagelog/_delete_by_query
body:
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "timestamp": {
              "lte": 1559318400000
            }
          }
        },
        {
          "term": {
            "eventId": {
              "value": "h5_request"
            }
          }
        }
      ]
    }
  }
}

result: