在关系型数据库和NoSQL数据库之外,还有一类非常重要的存储中间件——文件索引
Lucene 是一个开源的全文检索引擎类库,支持各种分词以及搜索相关的实现
在实际项目中进行二次开发,你需要非常熟悉 Lucene 的实现机制以及 API 应用
ElasticSearch 是一个基于 Lucene 的分布式全文检索框架,在 Lucene 类库的基础上实现
- ElasticSearch 开放了一系列的 RESTful API,基于这些 API ,可以快捷地实现各种搜索功能
-
ElasticSearch 对分布式场景下的应用有特别好的支持,包括良好的扩展性。可以扩展到上百台服务器的集群规模,以及近似实时分享的索引实现。
20230709161646.jpg
ELK stack
ElasticSearch 是由 Elastic 公司创建的,Elastic 公司还有另外两款产品
分别是 Logstash 及 Kibana 开源项目,这三个开源项目组合在一起称为 ELK stack
- ElasticSearch 用于数据分析和检索
- Logstash 用于日志收集
- Kibana 用于界面的展示
ELK 可以用于快速查询数据并可视化分析,在日志处理,大数据等领域有非常广泛的应用。
索引的如何建立
ElasticSearch 存储的单元室索引
关系型数据库是按照关系表的形式组织数据
大部分 NoSQL 数据库是 K-Value 的键值对方式
ElasticSearch 索引的实现基于 Lucene ,使用倒排索引的结构
倒排索引是百度等搜索引擎实现的底层技术之一
在搜索引擎中,索引的建立需要经过网页爬取,信息采集,分词,索引创建的过程
在 ElasticSearch 内存存储的实现中,数据的写入可以对比搜索引擎对网页的抓取和信息采集的过程
只需要关注分词和索引的创建
分词和索引
分词的策略会直接影响索引结果
分词器是一个可插拔的组件,包括内置的标准分词器
也可以引入对中文支持较好的 IKAnalyze 中文分词器等
假设我们在 ElasticSearch 中新增了两个文档,每个文档包括如下内容
- 文档1,Jerry and Tom are good friends.
Jerry / / and / / Tom / / are / / good / / friends /.
- 文档2,Good friends should help each other.
Good / / friends / / should / / help / / each / / other /.
一般,中文分词用得比较多的策略是基于字典的最长字符串匹配方式
有一小部分天然存在歧义的文档是无法处理的
比如 学生会组织各种活动
按照最长串匹配的方式,可以切分成 学生会/组织各种活动
但实际要表达的可能是学生/会/组织各种活动
建立索引
索引存储的结构是倒排索引
倒排索引描述了一个映射关系,包括文档中的分词后的结果哦,以及分别包含这些单词的文档列表
统一为小写,把分词之后的单词组成一个不重复的分词列表,可以按照字典序排序。
- 正排索引是 "文档-关键词" 的格式
-
倒排索引是 "关键词-文档" 的格式
20230709170458.jpg
对比 B+ 树
MySQL InnoDB 引擎的索引实现是基于 B+ 树
倒排索引和B+树索引有哪些区别呢?
B+ 树描述的是索引的数据结构
倒排索引是通过索引的组织形式来命名的
-
对于数据库,索引的作用是提高数据查询的性能
选择了 B+ 树作为索引的实现结果,可以更好的实现通过主键以及通过区间范围查询的要求 -
对于倒排索引,则是对应具体的应用场景
倒排索引实现的是根据关键词,也就是分词的结果,去查找文档,或者不同的网页。
总结
- ElasticSearch 存储组件及其应用
- 日志分析的三大件之 ELK技术栈
- 倒排索引是如何实现的
在一些小型项目中,会用数据库模糊匹配的方式实现关键字检索。
网友评论