[elk]elk学习笔记(1)
- 一、elasticsearch学习笔记(1)
- 为什么用es(es与lucene)
- es的一些基本概念(类比关系型数据库)
- 文档的元数据
- 索引的元数据
- es搜索的实现
一、elasticsearch学习笔记(1)
es是一个基于lucene二次开发后支持分布式的搜索引擎技术,支持较大数据量的搜索与聚合查询分析。es广泛用于日志分析、搜索、数据分析、应用监控分析等,更因为其分布式的特性,es相关技术栈在开发与运维方面都有广泛的应用。下面是本人在学习es过程中对es的一些学习经验与总结。
(本文学习时用的是官网目前最新的7.+版本)
(elk环境的搭建在此不做赘述,教程还是比较多的,需要注意的是elasticsearch、kibana、logstash、各种beat使用的时候要用同一版本)
为什么用es(es与lucene)
认识使用es,我们首先要对lucene索引技术有一定的了解,lucene作为java语言开发的搜索引擎类库,优点自然不用吹了,es以此为基础,肯定在搜索速度上不用多说,所以咱们只谈缺点或者准确来说是局限性:
- 个人认为api学习曲线比较陡峭(之前维护公司的老代码,检索、更新的方法看得想吐);
- 扩展性比较差,一份索引文件只支持一个后台实例调用,在微服务横行的今天,集群使用局限性太大;
- 只支持java语言;
当然es之所以流行,也肯定是对这三点有较好的改进:
- rest方式的查询api,更简单方便的dsl query语句;
- 支持分布式、高可用,可以水平扩展;
- rest…
es的一些基本概念(类比关系型数据库)
为了快速的理解es,我们可以跟mysql这种关系型数据库的一些概念做一些类比。
MySql | ElasticSearch |
Table | Index |
Row | Document |
Column | Field |
Schema | Mapping |
SQL | DSL |
比如说我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"
}
}
- _index 代表索引的名称
- _type 代表索引的类型
- _id 代表唯一id
- _source 代表文档的原始json数据,json中的对象由document中的每个字段组成
- _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基本的搜索功能是通过正排索引与倒排索引实现的。
- 正排索引简单理解就是通过文档id找到文档内容。
- 倒排索引则是通过单词找到文档的id。es中对json文档中的每个字段都有自己的倒排索引。(当然也可以指定字段不做索引)
正排就不做赘述,主要说一下倒排索引:
- 倒排索引主要包括两部分
- 单词词典(Term Dictionary)用来记录文档所有的单词,记录单词列表与倒排列表的关联关系。(词典一般都很大,查阅资料一般都是用B+tree或哈希拉链法实现)
- 倒排列表(Posting List)记录了单词与对应的文档的关系信息,由倒排索引项组成
- 倒排索引项
- 文档的id
- 词频 TF (单词在文档中出现的次数,用户查询相关性评分_score)
- 位置(Position)单词在文档中分词的位置。(用于phrase query)
- 偏移(Offset)记录单词开始结束的位置,用于高亮展示
es通过正排与倒排索引实现的基本搜索查询功能。