vlambda博客
学习文章列表

全文检索│ElasticSearch:让我来!

 一起来探索Code的奥秘

 To explore Code  


“ 经常不断的学习,你就什么都知道。你知道的越多,你就越有力量。——高尔基 

    生活中,可能所有人都间接用过他的作品,他是Lucene、Nutch 、Hadoop等项目的发起人。是他,把高深莫测的搜索技术形成产品,贡献给普罗大众;还是他,打造了目前在云计算和大数据领域里如日中天的Hadoop。

    Doug Cutting,被称为Hadoop之父,相信从事大数据方向的同学都有听过他的大名,而今天要讲的是基于Lucene的一个搜索服务器:ElasticSearch

    相信很多人都有个疑问,为什么百度服务器里存储了数以亿万记录的数据,但是我们每次搜索一个查询只要一秒都不到就可以出现所有的条目。而试想一下,如果把这种量级的数据存入数据库进行查询,无论你如何优化,相信速度依然很不理想。  所以,这就是全文搜索引擎ElasticSearch的魅力所在! 我相信国内的百度,搜狗,国外的谷歌基本都是用的这款搜索引擎,当然还要结合他们优秀的算法和其他种种条件因素的优化!

    废话不多说,在介绍这款引擎之前,请允许我先小叙几个概念~


检索

    在很久很久以前,人们去图书馆查阅书籍,一直都被书籍的繁多而无法快速地定位到想找到的书籍而烦恼,因此,一位图书管理员为了提升效率就对图书馆的书籍进行了归类,按照某种广为大众接受的方式去对所有的图书进行划分。这样再有学者过来查阅书籍就能通过检索这种方式来更快的找到想要的书籍啦。

倒排索引

    倒排索引是什么呢?既然有倒排索引,那自然就有正向索引,咱们先来看看什么是正向索引:

    以下,通过文章主体来进行检索文章里面的属性就是所谓的正向索引。

全文检索│ElasticSearch:让我来!


    而倒排索引,是索引技术中的一种,它是基于信息主体的关键属性值进行构建的。如下,通过文章里的每一个词,来用所有包含该词的文章构建索引。

全文检索│ElasticSearch:让我来!

而文章的排序是和权重计算有关,什么又是权重计算呢? 别着急,且往下看👇



全文检索│ElasticSearch:让我来!
全文检索│ElasticSearch:让我来!
全文检索│ElasticSearch:让我来!

    ElasticSearch用来做全文检索最大的优势是什么?毫无疑问:快!可以说非常快,人们研发产品,第一注重的就是用户使用该产品的一个体验,如果说使用一款搜索引擎进行一次查询,所需要的时间长达十几秒,用户盯着屏幕等待白白浪费了十几秒,那么它又有什么存在的意义呢?

    至于为什么检索要用es而不使用mysql,因素有很多,比如我们大多数的时候进行检索都是输入的词+词的查询方式,这种方式在MySQL里会用到 like "%xxx%",这样的模糊查询会遍历数据库的所有field来进行查询,可想而知他的工作量。而在同等量的数据集下,在es里面,只用找到对应的keyword倒排索引就可,速度根本不是一个量级的。

    除了检索条件快以外,相信大家也了解精准语义这个概念,全世界的NLPer都在努力的为信息检索精度提升做出自己的贡献,而在elasticsearch的支持下,融合最新的模型算法,可以在快速检索的条件下,一步步地提升检索精度,慢慢地给用户带来更佳的用户体验

    ElasticSearch对于文章权重的计算,是和Lucene用的同一公式:

全文检索│ElasticSearch:让我来!

公式的数学推导比较麻烦,有兴趣的同学可以自己去搜索相关资料完成验证

再次仅介绍几个重要的部分的含义:

     coord(q,d)
一次搜索可能包含多个搜索词,而一篇文档中也可能包含多个搜索词,此项表示,当一篇文档中包含的搜索词越多,则此文档则打分越高。
tf
Term t在文档d中出现的词频

  idf

Term t在几篇文档中出现过


全文检索│ElasticSearch:让我来!
全文检索│ElasticSearch:让我来!
全文检索│ElasticSearch:让我来!

    ElasticSearch封装了非常方便快捷的API供开发者使用,支持多语言的兼容,同时也有许许多多优秀的可视化索引应用提供,例如kibana,elasticsearch head等等。最后来简单介绍一下elasticsearch的使用吧~

    ElasticSearch是一款开包即用的软件,在Windows环境下,我们直接运行bin目录下的elasticsearch.bat文件,值得一提的是elasticsearch支持最低的是jdk1.8版本及以上。

全文检索│ElasticSearch:让我来!

    如图可以看到已经在本机的9200端口部署,那么我们来访问一下

全文检索│ElasticSearch:让我来!

     关于IK分词器,在bin的同级目录下有一个plugins目录,将ik分词器插件直接解压进该目录即可使用分词器了,同时也可在ik分词器里定义自己的个性化字典。通过RestFul风格的API,获得json的数据格式:

全文检索│ElasticSearch:让我来!

      

    而在Java中配置也十分的简单,在maven中导入相关依赖并书写配置类:

全文检索│ElasticSearch:让我来!


    这样就可以在Java中直接调用elasticsearch的API啦!

    具体的API调用方法可以参考我给大家在文章底部分享的资料


    Kibana是一款十分优秀的界面友好的可视化工具,同样是直接解压即用

    直接访问5601接口:

全文检索│ElasticSearch:让我来!

    可以看到界面十分的友好,操作也非常的方便,可以清晰的看到自己的索引库

全文检索│ElasticSearch:让我来!


    Ok,今天的分享就先到这,这是小白的第一篇文章,如果有不正确的地方欢迎大佬严厉指正,关注我,一起讨论,一起学习~

全文检索│ElasticSearch:让我来!
全文检索│ElasticSearch:让我来!

—— E N D ——

回复:elasticsearch即可获得

lucene+elasticsearch完整版视频教程!

更多惊喜福利:敬请期待~


 

Lesliecheni

ID : Lesliecheni

关注我,一起寻找学习中的灯塔.....