Elasticsearch简介与实践

10-16 1,301 views

Elasticsearch(https://www.elastic.co/products/elasticsearch/)是一个基于Lucene的开源搜索引擎,使用Elasticsearch可以搭建分布式、可扩展、高可用的搜索集群,并提供RESTful API。Elasticsearch包含的数据结构及其与关系数据库的类比如下所示:

Elasticsearch 关系数据库
index database
mapping table
document row
field field

工作中,我们使用Elasticsearch搭建搜索集群,对文章构建索引并提供文章搜索接口。

部署集群

使用了Elasticsearch中文发行版elasticsearch-rtf(https://github.com/medcl/elasticsearch-rtf),该版本针对中文集成了相关插件。从Github上下载压缩包(https://github.com/medcl/elasticsearch-rtf/archive/1.0.0.tar.gz)并解压。

集群配置

修改config/elasticsearch.yml,设置集群名称:

设置节点名称:

对于同一集群中的各个节点,要保证各节点的集群名称相同,节点名称不同,这样在启动集群中的各节点时,能通过广播发现同一网段中具有相同集群名称的其他节点组成集群。

Analyzer配置

搜索引擎构建索引时需要先对文档进行分析,从文档中提取出token(词元),实现此操作的是tokenizer,提取出的token会被进一步处理(如转成小写等),实现此操作的是filter, 被处理后的结果被称为term(词),搜索引擎使用这些term构建倒排索引。tokenizer+filter被称为analyzer(分析器)。Elasticsearch内置了很多analyzer, 还有很多第三方的analyzer插件, 比如用于中文分词的analyzer。在elasticsearch.yml中可以配置所支持的tokenizer、filter和analyzer。
elasticsearch-rtf已集成了很多第三方的analyzer插件,并在elasticsearch.yml中已配置,其中“string2int ”用于将字符串转化为整数,从而减小索引文件大小,节约内存,这个插件使用Redis存储字符串和整数的映射关系,所以如果需要使用这个插件,需要搭建Redis并配置Redis访问地址,如果不使用这个插件,可以直接删除该插件配置。“ansj”是基于ansj的中文分词插件,这个插件可选择使用Redis的pub/sub方式更新词典,如果不使用这个插件,也可以直接删除该插件配置。
实际使用中,针对analyzer,我们默认使用“keyword”,即不分词,内容整体作为一个Token,并配置了“ik”,用于对标题和正文进行中文分词,配置如下:

JVM配置

修改bin/service/elasticsearch.conf,设置堆大小:

运行

执行以下命令启动各节点,各节点通过广播发现同一网段中具有相同集群名称的其他节点自动组成集群。