[elk] elk 学习笔记

一、elasticsearch学习笔记(1)

es是一个基于lucene二次开发后支持分布式的搜索引擎技术,支持较大数据量的搜索与聚合查询分析。es广泛用于日志分析、搜索、数据分析、应用监控分析等,更因为其分布式的特性,es相关技术栈在开发与运维方面都有广泛的应用。下面是本人在学习es过程中对es的一些学习经验与总结。
(本文学习时用的是官网目前最新的7.+版本)
(elk环境的搭建在此不做赘述,教程还是比较多的,需要注意的是elasticsearch、kibana、logstash、各种beat使用的时候要用同一版本)

为什么用es(es与lucene)

认识使用es,我们首先要对lucene索引技术有一定的了解,lucene作为java语言开发的搜索引擎类库,优点自然不用吹了,es以此为基础,肯定在搜索速度上不用多说,所以咱们只谈缺点或者准确来说是局限性:

  1. 个人认为api学习曲线比较陡峭(之前维护公司的老代码,检索、更新的方法看得想吐);
  2. 扩展性比较差,一份索引文件只支持一个后台实例调用,在微服务横行的今天,集群使用局限性太大;
  3. 只支持java语言;

当然es之所以流行,也肯定是对这三点有较好的改进:

  1. rest方式的查询api,更简单方便的dsl query语句;
  2. 支持分布式、高可用,可以水平扩展;
  3. rest…

es的一些基本概念(类比关系型数据库)

为了快速的理解es,我们可以跟mysql这种关系型数据库的一些概念做一些类比。

MySqlElasticSearch
TableIndex
RowDocument
ColumnField
SchemaMapping
SQLDSL

比如说我mysql中建了一个book表有id、title、price、type字段,为了提高检索速度对应在es中建一个名叫book的index,也有对应的id、title、price、type在es中叫field,一本书的在MySql中对应的一条记录在es中对应一个Document,es中的mapping对应的就是各个字段设置的类型是int还是text、还有当前book索引的其他一些配置。sql可以查询book表,同样dsl可以查询book索引。。。

文档的元数据

{
       "_index" : "movies",
       "_type" : "_doc",
       "_id" : "3DoE62wBpSFQ65iTenzv",
       "_score" : 1.0,
       "_source" : {
         "movieId" : "2",
         "title" : "Jumanji (1995)",
         "genres" : "Adventure|Children|Fantasy"
       }
}
  1. _index 代表索引的名称
  2. _type 代表索引的类型
  3. _id 代表唯一id
  4. _source 代表文档的原始json数据,json中的对象由document中的每个字段组成
  5. _score 搜索的相关性分值

索引的元数据

使用GET movies (GET 索引名)获取索引的描述信息

{
  "movies" : { // 索引名
    "aliases" : { }, // 别名
    "mappings" : { // 定义的文档字段类型信息
      "_meta" : {
        "created_by" : "ml-file-data-visualizer"
      },
      "properties" : { // 字段的属性
        "genres" : { // 字段名
          "type" : "keyword" // 索引的类型
        },
        "movieId" : {
          "type" : "long"
        },
        "query" : {
          "properties" : {
            "match_all" : {
              "type" : "object"
            }
          }
        },
        "title" : {
          "type" : "text"
        }
      }
    },
    "settings" : { // 索引的设置信息
      "index" : {
        "creation_date" : "1567311034095",
        "number_of_shards" : "1", // 数据分片数
        "number_of_replicas" : "1", // 数据备份数
        "uuid" : "tzPBmKiYRK6BAa2XO4mwEw",
        "version" : {
          "created" : "7020099"
        },
        "provided_name" : "movies"
      }
    }
  }
}

es搜索的实现

es基本的搜索功能是通过正排索引与倒排索引实现的。

  1. 正排索引简单理解就是通过文档id找到文档内容。
  2. 倒排索引则是通过单词找到文档的id。es中对json文档中的每个字段都有自己的倒排索引。(当然也可以指定字段不做索引)

正排就不做赘述,主要说一下倒排索引:

  • 倒排索引主要包括两部分
    • 单词词典(Term Dictionary)用来记录文档所有的单词,记录单词列表与倒排列表的关联关系。(词典一般都很大,查阅资料一般都是用B+tree或哈希拉链法实现)
    • 倒排列表(Posting List)记录了单词与对应的文档的关系信息,由倒排索引项组成
      • 倒排索引项
        • 文档的id
        • 词频 TF (单词在文档中出现的次数,用户查询相关性评分_score)
        • 位置(Position)单词在文档中分词的位置。(用于phrase query)
        • 偏移(Offset)记录单词开始结束的位置,用于高亮展示

es通过正排与倒排索引实现的基本搜索查询功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值