- 全文搜索
- Lucene倒排索引
- 建立倒排索引的步骤
- Elasticsearch术语及概念
- 1.索引词(term)
- 2.文本(text)
- 3.分析(analysis)
- 4.集群(cluster)
- 5.节点(node)
- 6.路由(routing)
- 7.分片(shard)
- 8.主分片(primary shard)
- 9.副本分片(replica shard)
- 10.复制(replica)
- 11.索引(index)
- 12.类型(type)
- 13.文档(document)
- 14.映射(mapping)
- 15.字段(field)
- 16.来源字段(source field)
- 17.主键(ID)
- Elasticsearch安装
- Elasticsearch配置
- elasticsearch.yml配置
- 索引配置
- 日志配置
全文搜索 是指 计算机搜索程序 通过扫描文章中的每一个词,对 每一个词 建立一个索引,指明 该词 在文章中 出现的次数 和 位置
当用户查询时,搜索程序 就根据 事先建立的索引 进行查找,并将 查找的结果 反馈给用户
这个过程 类似于 通过字典中的搜索字表查字的过程
倒排索引 源于 实际应用中 需要根据 属性的值 来查找 记录
这种索引表中的每一项 都包括 一个属性值 和 具有该属性值 的 各记录 的 地址
由于 不是由 记录 来确定 属性值,而是由 属性值 来确定 记录的位置,因而称为倒排索引(inverted index)
带有倒排索引的文件 称为 倒排索引文件,简称倒排文件(inverted file)
倒排索引中 的 索引对象 是 文档 或者 文档集合中的单词等,用来存储 这些单词 在一个文档或者一组文档中 的 存储位置,是对 文档或者文档集合 的一种 最常用的索引机制
搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度(出现的次数)、位置(出现在哪一篇文章或网页中,及有关的日期,作者等信息)
好比一本书的目录、标签一般。读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页,一页一页地查找
- 取得关键词,在Lucene中由Analyzer类完成
- 建立倒排索引,关键词 对应 文章号[出现频率]、出现位置,Lucene中关键字 是按 字符顺序排列的(没有使用B树结构),因此 可以用 二元搜索算法 快速定位关键词
- 实现,Lucene将上面三列 分别作为 词典文件(Term Dictionary)、频率文件(frequencies)、位置文件(positions)保存。其中 词典文件 不仅保存了 每个关键词,还保留了 指向 频率文件和位置文件 的 指针,通过指针 可以找到 该关键字 的 频率信息 和 位置信息
Lucene中使用了field的概念,用于表达 信息所在位置(如标题中、文章中、URL中),在建索引中,该field信息 也记录在 词典文件中,每个关键词都有一个field信息,因为每个关键字一定属于一个或多个field - 压缩算法,为了减小索引文件的大小,Lucene对索引还使用了压缩技术。
首先,对 词典文件 中的 关键词 进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>
其次 大量用到的是 对数字 的 压缩,数字 只保存 与上一个值 的 差值(这样可以减少数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)
在Elasticsearch 中 索引词(term)是一个 能够被索引 的 精确值
foo、Foo、FOO几个单词是不同的索引词
索引词(term)是可以通过 term查询 进行准确的搜索
文本是一段普通的非结构化文字
通常,文本 会被分析成 一个个的索引词,存储在Elasticsearch的索引库中。为了让文本能够进行搜索,文本字段 需要事先进行分析;当 对文本中 的 关键词 进行查询的时候,搜索引擎 应该根据 搜索条件 搜索出 原文本
分析 是将 文本 转换为 索引词 的 过程,分析的结果 依赖于 分词器
比如:FOO BAR、Foo-Bar和foo bar这几个单词 有可能 会被分析成 相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中
当用FoO:bAR进行全文搜索的时候,搜索引擎根据匹配计算也能在索引库中搜索出之前的内容。这就是Elasticsearch的搜索分析
集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能
在所有节点,一个集群 有一个 唯一的 名称 默认为“Elasticsearch”,此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群
当需要有多个集群的时候,要确保每个集群的名称不能重复,否则,节点可能会加入错误的集群
请注意,一个节点只能加入一个集群
此外,还可以拥有多个独立的集群,每个集群都有其不同的集群名称
例如,在开发过程中,可以建立开发集群库和测试集群库,分别为开发、测试服务
5.节点(node)一个节点 是一个 逻辑上 独立的服务,它是集群的一部分,可以存储数据,并参与 集群的索引和搜索功能
就像集群一样,节点也有唯一的名字,在启动的时候分配
如果不想要默认名称,可以定义任何想要的节点名
这个名字在管理中很重要,在网络中 Elasticsearch集群 通过 节点名称 进行管理和通信
一个节点 可以被 配置加入 一个特定的集群
默认情况下,每个节点 会加入 名为Elasticsearch的集群中,这意味着 如果在网络上启动多个节点,如果网络畅通,他们 能彼此发现 并自动加入一个 名为Elasticsearch的集群中
在一个集群中,可以拥有多个想要的节点
当网络没有集群运行的时候,只要启动任何一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点
6.路由(routing)当 存储(动词) 一个文档的时候,它会 存储在 唯一的主分片中,具体哪个分片 是通过 散列值 进行选择,默认情况下,这个值 是由 文档的ID生成
如果 文档 有一个 指定的父文档,则从 父文档ID 中生成,该值 可以在 存储(动词)文档的时候 进行修改
分片 是 单个Lucene实例,这是Elasticsearch管理的比较底层的功能
索引 是指向 主分片 和 副本分片 的 逻辑空间
对于使用,只需要指定 分片的数量,其他不需要做过多的事情
在开发使用的过程中,对应的对象 都是索引,Elasticsearch会 自动管理 集群中 所有的分片,当发生故障的时候,Elasticsearch 会把 分片 移动到 不同的节点 或者 添加新的节点
一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制
例如,十亿个文档占用磁盘空间为1TB。仅从单个节点搜索可能会很慢,还有 一台物理机器也不一定能存储这么多的数据
为了解决这一问题,Elasticsearch 将 索引 分解成 多个分片
当创建一个索引,可以简单地定义想要的分片数量
每个分片 本身是一个 全功能的、独立的单元,可以托管在集群中的任何节点
8.主分片(primary shard)每个文档 都存储在 一个分片中,当存储一个文档的时候,系统 会首先 存储在 主分片中,然后会 复制到 不同的副本中
默认情况下,一个索引有5个主分片
可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改
每一个分片有零个或多个副本
副本主要是主分片的复制,其中有两个目的:
- 增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片
- 提高性能:当查询的时候 可以到 主分片 或者 副本分片中进行查询。默认情况下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加。副本分片必须部署在不同的节点上,不能部署在和主分片相同的节点上
分片主要有两个很重要的原因是:
- 允许水平分割扩展数据
- 允许分配和并行操作(可能在多个节点上)从而提高性能和吞吐量
这些很强大的功能对用户来说是透明的,用户不需要做什么操作,系统会自动处理
10.复制(replica)复制是一个非常有用的功能,不然会有单点问题
当网络中的某个节点出现问题的时候,复制可以对故障进行转移,保证系统的高可用
因此,Elasticsearch允许创建一个或多个拷贝,你的索引分片 就形成了 所谓的 副本或副本分片
复制是重要的,主要的原因有:
- 它提供了高可用性,当节点失败的时候不受影响。需要注意的是,一个复制的分片 不会存储在 同一个节点中
- 它允许扩展搜索量,提高并发量,因为搜索可以在所有副本上并行执行
每个索引 可以拆分成 多个分片
索引 可以 复制 零个或者多个分片
一旦复制,每个索引 就有了 主分片 和 副本分片
分片的数量 和 副本的数量 可以在 创建索引时定义
当创建索引后,可以随时改变 副本的数量,但不能改变 分片的数量
默认情况下,每个索引分配5个分片和一个副本,这意味着的集群节点至少要有两个节点,将拥有5个主要的分片和5个副本分片共计10个分片
注意 每个Elasticsearch分片是一个Lucene的索引
有文档存储数量限制,可以在一个单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档
可以使用_cat/shards API监控分片的大小
索引 是 具有 相同结构 的 文档集合
例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引,在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等
在单个集群中,可以定义多个想要的索引
索引结构参见图1-2
在索引(index)中,可以定义一个或多个类型(type),类型(type) 是 索引(index) 的 逻辑分区
在一般情况下,一种类型(type) 被定义为 具有 一组 公共字段 的 文档
例如,假设运行一个博客平台,并把所有的数据存储在一个索引(index)中。在这个索引中,可以定义一种类型(type) 为用户数据,一种类型(type) 为博客数据,另一种类型(type) 为评论数据
文档 是 存储在 Elasticsearch中的 一个 JSON格式 的 字符串。它就像 在关系数据库中 表的一行
每个 存储在 索引(index)中的一个文档(document) 都有 一个类型(type) 和 一个ID,每个文档(document) 都是一个 JSON对象,存储了 零个或者多个字段,或者键值对
原始的JSON文档 被存储在一个 叫作_source的字段中
当搜索文档的时候 默认返回的 就是这个字段
映射 像 关系数据库中的 表结构,每一个索引(index) 都有一个 映射(mapping),它定义了 索引(index)中的 每一个字段类型,以及 一个索引范围内的设置
一个映射可以事先被定义,或者在第一次存储文档的时候自动识别
文档(document)中 包含 零个或者多个字段,字段 可以是 一个简单的值(例如字符串、整数、日期),也可以是 一个数组或对象的嵌套结构
字段 类似于 关系数据库中 表的列
每个字段(field) 都对应一个 字段类型,例如整数、字符串、对象等
字段还可以指定如何分析该字段的值
默认情况下,你的原文档将被存储在_source这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始的对象,这个对象返回一个精确的JSON字符串,这个对象不显示索引分析后的其他任何数据。
17.主键(ID)ID 是 一个文件 的 唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID
文档的index/type/id必须是唯一的
在JAVA_OPTS中对Elasticsearch最重要的参数是-Xmx最大可以使用内存的参数
一般情况下大内存更能发挥Elasticsearch作用,建议-Xmx 设置为 物理内存的一半
为了减少 内存分配 带来的性能损耗,最好一开始 就设置 初始内存和最大内存 都为 物理内存的一半,即Xms和Xmx这两个参数
Elasticsearch配置文件在elasticsearch/config文件夹下。在这个文件夹中有两个文件,一个是Elasticsearch配置不同模块的配置文件elasticsearch.yml,另一个是Elasticsearch日志的配置文件logging.yml
默认配置文件的格式为YML
elasticsearch.yml配置集群名称:
cluster.name:my-application
确保在不同的环境中集群的名称不重复,否则,节点可能会连接到错误的集群上。
节点名称:
node.name:node-1
默认情况下,当节点启动时Elasticsearch将随机在一份3000个名字的列表中随机指定一个
如果机器上只运行一个集群Elasticsearch节点,可以用${HOSTNAME}设置节点的名称为主机名
节点描述:
node.rack:r1
索引存储位置:
path.data:/path/to/data
日志存储位置:
path.logs:/path/to/logs
内存分配模式:
bootstrap.mlockall:true
绑定的网卡IP:
network.host:192.168.0.1
http协议端口:
http.port:9200
开始发现新节点的IP地址:
discovery.zen.ping.unicast.hosts:["host1", "host2"]
最多发现主节点的个数:
discovery.zen.minimum_master_nodes:3
当重启集群节点后最少启动N个节点后开始做恢复:
gateway.recover_after_nodes:3
在一台机器上最多启动的节点数:
node.max_local_storage_nodes:1
当删除一个索引的时候,需要指定具体索引的名称:
action.destructive_requires_name:true
索引配置
在集群中 创建的索引 可以提供 每个索引自己的设置
例如,下面创建一个索引刷新间隔是5秒钟而不是默认的刷新间隔(格式可以是YAML或JSON):
请求:PUT http://127.0.0.1:9200/kimchy
参数:index:refresh_interval:5s
这个索引参数可以设置在节点上,例如,在elasticsearch.yml文件中可以设置:
index.refresh_interval:5s
这意味着除非索引明确定义,这个节点上创建的每个索引的刷新间隔为5秒
当然也可以在启动Elasticsearch的时候用参数指定:
elasticsearch -Des.index.refresh_interval=5s日志配置
Elasticsearch内部使用log4j记录系统日志,它试图通过使用YAML配置方式来简化log4j的配置,配置文件位置为elasticsearch/config/logging.yml,JSON格式和键值对的格式也是支持的
可以加载多个配置文件,在启动Elasticsearch后系统自动合并多个配置文件
支持不同的后缀格式,例如:(.yml,.yaml,.json or.properties)
记录器部分包含java包和相应的日志级别,在配置里可以省略org.elasticsearch前缀
Appender部分包含日志描述信息
由于日志比较重要,正常情况下不要禁止日志的产生,如果感觉日志过多,可以提高日志的级别
系统日志每日会生成一个新的文件
当遇到问题的时候,首先要检查一下日志文件,看看是否有出错的信息



