Elasticsearch 搜索引擎应用实战

某知名互联网公司技术经理,公众号:图南随笔

文章正文

我们建立一个网站或应用程序,全文搜索是一个非常常见的需求,当数据量很小且搜索条件较少时,还可以使用 MySQL 等数据库来做,但是当数据量比较大或者搜索条件非常复杂时,就需要考虑一些全文搜索引擎了。

ES 概述

开源的 Elasticsearch(以下简称 ES)是目前全文搜索引擎的首选。它是一个基于 Lucene 的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,它同时基于 RESTful Web 接口,可以快速地储存、搜索和分析海量数据。

下面列举一些简单的使用案例来说明 ES 的使用场景:

1. 电子商务网站

在电子商务网站中,可以用ES来存储所有商品的可用于搜索的基本信息(比如标题、标签、类目、属性词等),用户可以快速的搜索到想要的商品。

2. 日志信息收集

通常使用 ELK(ES、Logstash、Kibana)通用解决方案,Logstash 收集、聚合多台服务器上的日志信息,并发这些信息发送到 Elasticsearch 中存储,Kibana 可以提供友好的 web 界面来对收集到的日志信息进行分析。

3. 价格监控

比如客户的需求为“某商品在未来一个月内低于某价格时提醒我”,我们可以把这些查询条件存储到 ES 索引中,然后使用 reverse-search(Percolator)(反向搜索过滤器)功能匹配客户查询价格的变动,最后如果发现匹配成功就给客户发出通知。

以上只是几个简单的实例,ES 的应用场景远不止于此。ES 具有高可用、可扩展、安装使用简单等优点。

ES 与其他搜索引擎的对比:Lucene 、Solr、Sphinx

Lucene

Lucene 采用的是倒排索引的方式。倒排索引可以根据单词快速获取包含这个单词的文档列表,提高查询效率。

Lucene 就是一个纯粹的索引程序代码包,使用的时候,你得写一个简单的 Server 程序(接受关键词 - 通过 Lucene 查询 - 返回结果),然后配置在应用服务器中(Tomcat/Resin),一般来说,这个 Server 程序会采用 HTTP 协议,或者 XML-RPC。

使用 Lucene 有一定的挑战性。想要用好它的话,你需要时刻留心很多东西。而且它只是一个 jar 包,不支持分布式。

ES 和 Solr 的异同

  1. ES 和 Solr 都是基于 Lucene 的
  2. 当单纯的对已有数据进行搜索时,Solr 更快。
  3. Solr 建立索引时候,搜索效率下降,实时搜索效率不高,ES 实时搜索效率高,Solr 频繁写入的话,索引效率很低。
  4. Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
  5. Solr 支持更多格式的数据,比如 JSON、XML、CSV,而Elasticsearch 仅支持 json 文件格式。
  6. Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供
  7. Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
  8. Solr 是传统搜索应用的有力解决方案,但Elasticsearch更适用于新兴的实时搜索应用。
  9. ES 支持分布式,节点对外表现对等,加入节点自动均衡
  10. ES 采用 Gateway 的概念,使得数据持久化更简单
  11. ES 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作
  12. Solr 一般要部署到 web 服务器上,比如 tomcat,启动 tomcat,配置 Solr 和 tomcat 的关联。ES 一般可以单独启动,然后 ES 和 Spring 整合,调用 SpringDataElasticSearch 里面提供的方法 。

ES 和 Sphinx 的区别

1. 搜索算法支持:

ES 的搜索底层功能基于 Lucene,Sphinx 也该有的都有。然而 ES 的 Query DSL 支持更复杂的查询逻辑,这一点是超越 Sphinx 的。在自定义 Ranker 方面,ES 的 Function Score Query 比 Sphinx 的 expression-ranker 强大许多。总的来说,ES 稍微优于 Sphinx。

2. 横向扩展与高可用

ES 是天生为了集群化而设计的。索引如果没有 Replica 就会显示黄灯,有才会亮绿灯。每个节点分为 Client Node、Data Node、Master Node 三种角色,在合理的配置之下,任意一台(甚至多台)机器炸了,整个集群都能正常运行。ES 还支持动态加机器等等功能。

Sphinx 也有 master searchd 和 slave searchd 的概念,可以分布式,但想实现高可用就相当复杂了。

在横向扩展和高可用方面,ES 优于 Sphinx。Sphinx 的劣势不在于做不到,而在于不好用。

3. 资源占用

Sphinx 优于 ElasticSearch。Java 在这方面比不上 C++。CPU 还好,差距不大

作者正在撰写中...
隐藏内容 支付可见
¥2.99 购买
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容