浅析ElasticSearch入门

前言

刚毕业的小明同学入职一家互联网公司,开开心心的拿到了他的第一个开发任务。
项目经理:客户这边有个需求,让你做一个搜索框,他们输一写东西,你就把数据资源查出来给他们,这个功能很急,明天要上线。
小明同学:好的,我加油,保证完成任务。(内心:就这?没啦? 一曲凉凉安排上!)
一脸懵逼的小明同学冥思苦想之后盯上了系统里面几张特变常用的数据表,好的,就安排你们了。于是乎,小明写了一堆SELECT 查询列表 FROM 表名 WHERE 字段 like %搜索关键字% 类似这样的模糊匹配。除此之外又写了几个连接查询。
果不其然第二天就被项目经理请喝茶。
项目经理:今天系统运行的很慢,刚刚DBA发现是你写的代码,是不是没建索引啊,赶快解决。
小明同学:好的经理,我一定立马改正错误。(内心:索引是啥,我好难啊!)
于是乎小明同学在历经几个小时的苦心钻研之后,向前辈学习到数据库视图和数据库索引这一系列加快查询的高级技能,在他的努力下,系统不卡了,项目经理表扬了他一番。
平静的日子就这样过去了几天,有一天,项目经理轻描淡写的找打小明同学提出了新的需求。
项目经理:小明啊,上次那个搜索整的不错,客户反映还行。我考虑了一下,在咱们之前的系统里面也提供这样的接口,不仅如此,搜索出来的东西匹配度要更高才行啊。
小明:好的经理,我试试。(内心:阿西吧,我太难了!)
终于,小明不得不面向搜索引擎编程,开始百度:站内搜索引擎怎么弄(内心:哪里伏击项目经理合适?)

没错,我曾经就是这位小明同学…

ES

ElasticSearch:是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
上面一段话来自于百度百科,但下面才是敲黑板的内容:

  1. 底层是Lucene,ES在它基础上进行抽象,升级改造之后更加好用,更加强大。
  2. 分布式搜索哦,意味着他能解决数据同步的问题。不是分布式的也能用,甚至更方便。(重点敲黑板:数据同步问题一直是企业的痛点,一个企业的很多系统,相同作用的数据表,字段不统一、不同的系统之间数据接口不互通,都是在查询视图,历史版本等遗留问题也很难得到解决
  3. 最流行的企业搜索引擎,GitHub的全局站内搜索也是用的它。
  4. 随着云(云计算)越来越普及,读写分离也有了新的含义,目前企业内最标准的读写分离办法是:将读放在云上处理,将写放在后台处理,那么ES这种查询是放在云上还是放在后台呢?

所以,有了它,不用写模糊匹配了。也不用想搜索引擎中那些专业词汇,分词、句柄等等这些概念不知道都可以。

使用场景

  • 全文检索:维基百科,百度百科,全文检索,高亮,搜索推荐
  • 新闻网站:用户点击行为分析
  • 论坛:比如搜索程序报错信息,搜索解决方案
  • 开源代码托管平台:GitHub
  • 电商网站:商品搜索(如果是简单的商品搜索还行,但是用户往往在淘宝上搜索的不仅仅是商品,比如:最近流行什么颜色的女士大衣?所以淘宝的搜索技术是更加智能的)
  • EKL:日志分析(ELK技术,elasticsearch+logstash+kibana)
  • 数据流控制:用户设定商品的监听价格阈值,当低于该阈值的时候,发送通知消息给用户。例子就是:当这个衣服降价到300块钱的时候通知我
  • 站内搜索:这是目前最火热的应用场景

基础概念

ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型。
Index 索引
类比于关系数据库的库,用于定义文档类型的存储;
Type文档类型
类比于关系数据库的表,不同的文档类型,能够存储不同的字段,服务于不同的查询请求;
Document文档
类比于关系数据库的行,用于描述文档中的各个字段的定义;

回到开头的小故事,小明应该怎么做全局站内搜索呢?
1、将ES启动,使用ES生态圈里的工具(logstash)将关系数据库数据库同步到ES里面。
需要注意的是,ES里面的配置文件可以连接到数据库,并将全部的数据同步到ES中,可以设置同步的周期,这样就能保证增量数据和常亮数据都能搜索到。小明需要做的就是给这次索引起个名字就好。假设就叫xm1吧。
2、连接上ES集群,假设没有集群的话直接就连部署的主机就好,根据ES的查询规则去查询xm1这个索引。
3、得到数据,对应在关系数据库的那张表里面呢?去看Type的类型就好了,这行数据呢,就是Document啦。
ES查询的结果还会有相关度评分,并且查询的结果是按照查询评分的降序排列的,这些都是可以重新复写接口的方法进行控制的。

那么,项目经理想要小明将这套站内搜索运用到任何系统之上,只要需求是对数据库进行搜索,小明只需要拿到那套系统数据库的连接,新建索引xm2,xm3就可以达到同样的目的了。甚至可以做到弹性搜索,也就是对于历史数据做好索引留在ES内部就好啦,当系统灰度发布的时候,只需要将最新的索引提供出来,就能很好支持搜索功能。
并且,ES的查询效率极高,返回结果的时间通常是毫秒级的。

更多ES核心技术,参阅官方核心权威指南:
ES官方中文技术文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

猜你喜欢

转载自blog.csdn.net/XiaoA82/article/details/102017740