数据分类
- 非结构化数据 全文数据。不定长或无固定格式 报错xml,HTML,Word
- 结构化数据 行数据,由二维表结构来逻辑表达和实现的数据
非结构化数据
对于非结构化的数据 搜索主要有两种方法
- 顺序扫描
- 全文检索
顺序扫描
一般不建议这么做。例如给你一张报纸,让你找到该报纸中“平安”的文字在哪些地方出现过。你肯定需要从头到尾把报纸阅读扫描一遍然后标记出关键字在哪些版块出现过以及它的出现位置。
这种方式无疑是最耗时的最低效的,如果报纸排版字体小,而且版块较多甚至有多份报纸,等你扫描完你的眼睛也差不多了。
全文检索
对非结构化数据顺序扫面很慢,把我们的非结构化数据想办法弄得有结构就行。将非结构化数据的一部分信息提取出来,重新组织,使其变得有一定的结构然后对这种数据进行搜索,从而达到搜索相对较快的目的,这种方式就构成了全文检索的基本思路,这部分从非结构化数据中提取出的然后重新组织的信息,我们称之为索引。
理解倒排索引
-
Java is the best programming language.
-
PHP is the best programming language.
-
Javascript is the best programming language.
为了创建倒排索引,我们通过分词器将每个文档的内容域拆分成单独的词,我们称之为词条或Term 创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。这种由属性值来确定记录的未知的结构就是倒排索引,带有倒排索引的文件我们称为倒排文件
其中主要由如下几个核心数据需要理解
- 词条 Term 索引里面最小的存储和查询单元
- 词典 是词条Term的集合 搜索引擎的通常索引单位是单词,单词词典是由文档中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向倒排列表的指针
- 倒排列表 一个文档通常由多个词组成,倒排表记录的是某个词在那些文档里出现过以及出现的位置
- 倒排文件 所有单词的倒排列表往往顺序 的存储在磁盘的某个文件里,这个文件为称之为倒排文件,倒排文件是存储倒排索引的物理文件
倒排索引 主要词典,倒排文件构成,
es核心概念
ES 是使用 Java 编写的一种开源搜索引擎,它在内部使用 Lucene 做索引与搜索,通过对 Lucene 的封装,隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。
它可以被下面这样准确的形容:
-
一个分布式的实时文档存储,每个字段可以被索引与搜索。
-
一个分布式实时分析搜索引擎。
-
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
官网对 Elasticsearch 的介绍是 Elasticsearch 是一个分布式、可扩展、近实时的搜索与数据分析引擎。
我们通过一些核心概念来看下 Elasticsearch 是如何做到分布式,可扩展和近实时搜索的。
集群
es的集群搭建很简单,不需要依赖第三方,自身内部就实现了集群的管理功能,es集群由一个或多个elasticsearch节点组成,每个节点配置相同的cluster.name即可加入集群,默认为elasticsearch
确保不同的环境中使用不同的集群,否则最终回到这节点加入错误的集群
一个elasticsearch服务启动实例就是一个节点Node 节点通过node.name来设置节点名称,如果不设置则在穷是给节点分配一个随机通用唯一标识符作为名称
发现机制
Zen Discovery 是ES的内置默认发现模块,发现模块的职责是发现集群中的节点以及选举Master节点,提供单播和基于文件的发现,并且可以或者为通过插件支持云环境和其他形式的发现。Zen Discovery 与其他模块集成,例如 结点之间的所有通信都是用Transport模块完成,节点使用发现机制通过Ping的方式查找其他节点。
Elasticsearch默认被配置为使用单播发现,防止节点无意中加入集群,只有在同一台机器上运行的节点才会自动组成集群
如果集群的节点运行在不同机器上,使用单播,你可以为es提供一些它应该去尝试连