Elasticsearch 实战(一) - 简介

欢迎关注全是干货的公众号:JavaEdge
本文链接: https://blog.csdn.net/qq_33589510/article/details/102675247
  • 官腔
    Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统

基本等于没说,咱们慢慢看

1 概述

百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象)
百度 != 搜索,这是不对的

垂直搜索(站内搜索)

  • 互联网的搜索:电商网站,招聘网站,新闻网站,各种app
  • IT系统的搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“牙膏”,订单,“牙膏相关的订单”

搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的有些信息


2 数据库搜索

数据都是存储在数据库里面的
很自然的,如果从技术的角度去考虑,如何实现搜索,电商网站内部的搜索功能的话,就可以考虑,去使用数据库去进行搜索。

2.1 案例 - 电商系统的搜索

  • 搜索含有牙膏的商品
  • 在数据库中商品名称字段中存储有关键字

数据库来处理的话,不考虑数据库的全文索引什么的,假如商品有 1000万 个,那么基本上就要查找 1000 万次,且每次都需要加载商品的名称字段的整段字符串,并挨个寻找。

  • 每条记录的指定字段的文本,可能会很长
    比如“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,懒判断说,你包不包含我指定的这个关键词(比如说“牙膏”)
  • 无法将搜索词拆分开来
    尽可能去搜索更多的符合你的期望的结果,比如输入“生化机”,就搜索不出来“生化危机”

用数据库来实现搜索,是不太靠谱的。通常来说,性能会很差的。


3 全文检索 & Lucene

3.1 全文检索

3.1.1 场景:搜索“生化机”

  • 全文检索

(有可能是手抖打错了,本来是生化危机),但是期望需要出来右侧的 4条 记录

有 4条 数据
将每条数据进行词条拆分。如“生化危机电影”拆成:生化、危机、电影 关键词(拆分结果与策略算法有关)
每个关键词将对应包含此关键词的数据 ID
搜索的时候,直接匹配这些关键词,就能拿到包含关键词的数据
这个过程就叫做全文检索。而词条拆分和词条对应的 ID 这个就是倒排索引的的基本原理

对比数据库的缺陷

数据库里的数据,共有100万条,按照之前的思路,其实就要扫描100万次,而且每次扫描,都需要匹配那个文本所有的字符,确认是否包含搜索的关键词,而且还不能将搜索词拆解开来进行检索

利用倒排索引

进行搜索的话,假设100万条数据,拆分出来的词语,假设有1000万个词语,那么在倒排索引中,就有1000万行,我们可能并不需要搜索1000万次。
很可能说,在搜索到第一次的时候,我们就可以找到这个搜索词对应的数据。
也可能是第100次,或者第1000次

3.2 lucene

就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法

java开发的时候,引入lucene jar,然后基于lucene的API进行去进行开发就可以了
用lucene,我们就可以去将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构
另外的话,我们也可以用lucene提供的一些功能和API来针对磁盘上额

4 Elasticsearch的意义

我们可以使用 lucene 开发搜索服务,部署在一台机器上面,但是无法解决当数据量增大的时候出现的问题(图上右侧)。
那么 elasticsearch 就是解决这种场景的工具;

  • 自动维护数据的分布到多个节点的索引建立、检索请求分布到多个节点的执行
  • 自动维护数据的冗余副本,保证一些机器宕机了,不会丢失任何数据
  • 封装了更多的高级功能
  • 给我们提供更多高级的支持,让我们快速的开发应用,开发更加复杂的应用
  • 复杂的搜索功能,聚合分析的功能,基于地理位置的搜多(距离我当前位置 1公里 以内的烤肉店)

参考

猜你喜欢

转载自blog.csdn.net/qq_33589510/article/details/102675247