elasticsearch技术实战——第一篇(使用篇)

 为了提高搜索命中率和准确率,改善现有羸弱的搜索功能,公司决定搭建全文搜索服务。由于之前缺乏全文搜索使用经验,经过一番折腾,终于不负期望按期上线。总结了一些使用心得体会,希望对大家有所帮助。计划分三篇:

  1. 第一篇(使用篇),主要讲解基本概念、分词、数据同步、搜索API。
  2. 第二篇(配置及参数调优篇),主要围绕JVM参数调优、异常排查、安全性等方面讲解。
  3. 第三篇(倒排索引原理篇),知其然知其所以然。

一、技术选型

  说到全文搜索大家肯定会想到solr和elasticsearch(以下简称es),两者都是基于lucence,到底有什么区别呢?主要列出四个方面:

对比项 solr elasticsearch
分布式 利用zookeeper进行分布式协调 自带分布式协调能力  
数据格式 支持更多的数据格式(XML、JSON、CSV等) 仅支持JSON
查询性能 更适合偏传统的搜索应用,单纯对已有数据进行搜索性能更高,但实时建立索引时查询性能较差。 在实时搜索应用中表现更好,数据导入性能更好
数据量对查询性能影响 明显下降 影响不大

  最终选择es,主要原因:

  1. 作为后起之秀,吸收了solr的优秀设计,在实时搜索上性能更佳,大有超越solr之势。
  2. 社区非常活跃,文档齐全,越来越多的应用从solr迁移至es。典型案例较多:GitHub使用es来检索超过1300亿行代码、Wikipedia 使用es提供带有高亮片段的全文搜索。

二、基本概念

  1. 集群(cluster)和节点(node):一个集群里包含多个节点,其中一个主节点通过选举产生,集群中任一节点的通信与整个es集群通信是等价的。
  2. 索引(index):es包含一个或多个索引,相当于关系型数据库(以下简称RDS)里的数据库,可以向索引里写入或读取数据。
  3. 类型(type):一个索引包含一个或多个type,相当于RDS里的表。
  4. 文档(document):相当于RDS里的数据行,文档没有固定的格式(schemaless),与mongodb很类似。
  5. 分片(shards):可以把一个大索引拆分成多个分片,分布到不同的节点上,提高检索效率。分片数在创建索引时确定,无法更改。
  6. 副本(replicas):副本有两个作用,一是增加容错,当某个分片损坏或丢失时可以由其他副本恢复;二是增加系统负载,当搜索流量增加可以通过动态增加副本来满足要求。
  7. 倒排索引(inverted index):由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。倒排索引时lucence核心数据存储结构。

三、中文分词

 3.1、分词器选型

默认分词器对英文支持较好,但对中文不友好,会把中文拆分成一个个汉字,这显然不满足需求。

市面上中文分词器不少,该如何选择,主要考虑以下几点:

  1. 自带默认词库,支持自定义词库扩展。
  2. 词库支持热更新(不重启es服务,自动生效)。
  3. 社区活跃,使用较广,分词效果好。

基于以上几点,很容易想到IK分词器,IK提供了两种分词模式:

分词模式 描述
ik_max_word

会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”

拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,

会穷尽各种可能的组合

ik_smart 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”

IK分词器项目地址:https://github.com/medcl

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信