在 T-Pot 的实际应用中,各个蜜罐所产生的日志都会导入到 Elastic Search 中,因此可以使用 Elastic Search 来进行检索,同时也可以使用他对数据进行各种复杂条件的查询和导出等。
Elasticsearch的强大之处就是可以模糊查询,是使用索引的。
那么,索引是什么?简单了解一下
https://cloud.tencent.com/developer/article/1798732
索引的本质是一种排好序的数据结构。根据不同的数据结构可以分成hash索引,也就是根据key的hash进行查找,但是由于每个key的hash索引相同率很低,所以hash索引适合精确查找。还有就是二叉树结构,时间复杂度O(n),由于数据量的增大,二叉树的性能会明显降低,而Elasticsearch就是为了处理大数量级的数据量而设计的。B-树则是应对亿级别数据量,主存中存储不下的时候,通过块的形式从磁盘读取数据,和二叉树最大的不同就是B-树可以有多个孩子节点,每页的存储空间是有限的,如果 data 比较大,会导致每个节点的 key 存储的较少,当数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数,进而影响查询效率。
关于B-树https://zhuanlan.zhihu.com/p/146252512

B+树,数据记录节点按照键值大小存放在同一层叶子结点上,非叶子结点只存储key信息。在mysql存储数据的数据页之间通过双向链表关联,那么,mysql是如何定向到数据页的呢?每个数据页的页号和最小主键会形成一个主键目录。而当数据页过多的时候呢?主键目录结构就会演化成索引页的形式。

索引页过多的时候,再以数据页进行维护的方式,在最小主键→索引页进行维护。

Elasticsearch是如何做到模糊匹配的?
分词能力,根据不完整的条件再查找对应记录,叫做倒排索引。通过将搜索的关键词进行分割,再去文档中进行匹配,记录匹配次数较高的。Elasticsearch有内置分词器,中文分词器主要是IK。例如搜索Elasticsearch,就会将这个单词进行分词,分词形成一个Term Dictionary,通过分词找到的记录形成一个PostingList。由于Term Dictionary中会存储大量分词,Term index存储部分词的前缀,并存放在内存中。
结构
- Index:Elasticsearch的Index相当于数据库的Table
- Type:这个在新的Elasticsearch版本已经废除(在以前的Elasticsearch版本,一个Index下支持多个Type--有点类似于消息队列一个topic下多个group的概念)
- Document:Document相当于数据库的一行记录
- Field:相当于数据库的Column的概念
- Mapping:相当于数据库的Schema的概念
- DSL:相当于数据库的SQL(给我们读取Elasticsearch数据的API)
集群
一个Elasticsearch集群会有多个Elasticsearch节点,所谓节点实际上就是运行着Elasticsearch进程的机器。其中会有一个主节点Master Node。
index(相当于表)可以分发到不同的结点上存储,这个操作就是分片。多个被分片的数据合起来就是index数据。数据写入到主分片,副分片复制主分片,主副可读(这个结构已经很常用了)

Comments | NOTHING