公司技术分享-全文技术分享Lucene VS ElasticSearch VS Solr

版权声明:专注于技术分享,原创版权归 十年呵护所有,转载请标明原文链接,更多信息可关注 wwws.shinians.com 官网 https://blog.csdn.net/zzhuan_1/article/details/89215718

全文

前言:

目前,我们最常使用的是关系型数据库进行数据的存储,数据库中的搜索很容易实现,通常都是使用sql语句进行

查询,而且能很快的得到查询结果。模型图如下:

但随着业务的复杂性,原有的关系型数据库会显得力不从心,具体瓶颈表现为以下两方面:

数据量瓶颈:大数据时代的到来,意味着程序要对大量的数据进行运算和存储,当数据库存储大量数据时,

数据库的压力就会变得很大,查询速度会变得非常慢,不管是mysql还是oracle,查询速度可能获得等待几分

钟甚至更长

数据类型单一瓶颈:常见的数据类型分为结构化数据和非结构化数据,数据库仅可以存储固定格式和有限长

度的结构化数据,而不定长或无固定格式的非结构化数据,例如邮件,文档等磁盘文件,数据库是很难进行

存储的

一、核心技术及概念总览:

  1. Lucene
  2. Solr
  3. ElasticSearch
  4. Analyzer: 
  5. 倒排索引
  6. IKAnalyzer

二 、什么是全文搜索:

1、概念:

全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

  1. 生活中的数据总体分为两类:

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据:非结构化数据又可称为全文数据,指不定长或无固定格式的数据,如邮件,Word文档,XML,HTML等。

    2.对于非结构化数据,也即对全文数据的搜索主要有两种方法

    顺序扫描法:所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。例如:window的文件搜索,文档内部关键词的搜索等。

倒排索引法:所谓倒排索引法,类似根据新华字典的拼音首字母或偏旁部首进行相应的文字的查询,而不是对整个字典逐字寻找,这种方式的优点很明显可以极大的缩短寻找某个字的时间,提高搜索效率,但该方式需要的前期工作就是将文字的拼音首字母和偏旁进行提取汇总,此处文字的拼音首字母和偏旁我们可以称之为索引。

反思对非结构化数据顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了吗?

三、 Lucene

Lucene 是一个 Java 全文搜索引擎,完全用 Java 编写。Lucene 不是一个完整的应用程序,而是一个代码库和 API,可以很容易地用于向应用程序添加搜索功能。Lucene 通过简单的 API 提供强大的功能:

相关概念:

数据源 DataSource

被存储到索引库中的数据的来源,称之为数据源,例如:字符串、文档、数据库中表数据等。

分词器 Analyzer

分词器 Analyzer也称为分析器,一段有意义的文字需要通过Analyzer分词器分割成一个个词语后才能按关键字搜

索,StandardAnalyzerLucene中最常用的分词器。为了达到更好的搜索效果,不同的语言可以使用不同的分词

器( 例如IKAnalyzer是一个主要处理中文的分词器 )。

令牌 Token

Analyzer返回的结果就是一串TokenToken包含一个代表词本身含义的字符串(也就是词本身嘛)和该词在文章

中相应的起止偏移位置,Token还包含一个用来存储词类型的字符串。

词条 Term

term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field

文档 Document

用户提供的数据源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引

之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。

Field

一个Document可以包含多个信息域,例如一篇文章可以包含标题正文最后修改时间等信息域,这些信息

域就是通过FieldDocument中存储的。

索引库 Index

Index索引库,文档的集合组成索引。和一般的数据库不一样,Lucene不支持定义主键,在Lucene中不存在一个叫

Index的类,通过IndexWriter来写索引,通过IndexReader来读索引。索引库在物理形式上一般是位于一个路径下的一系列文件。

 

重点概念:分词,索引,存储

分词的目的是:将较长的字符串分割成一个一个的单词(我们也称之为语汇单元)

索引的目的是:可以根据语汇单元查询到相应的文章内容

存储的目的是:将文章的相关内容存储到索引库中,方便根据索引查询时返回相应的内容

 

通常,比如我们要查找一篇CSDN的博客,我们要根据标题搜索博文,也有可能根据博客文章内容中的某些词汇搜索博文,还有可能根据博文的作者

搜索,搜索后需要看到博文的标题、作者、时间、正文等。综上分析,我们的操作应该如下:

分词操作后,会生成一串TokenToken包含一个代表词本身含义的字符串(也就是词本身嘛)和该词在文章中相应的起止偏移位置,Token还包含一个用来存储词类型的字符串,例如:对标题《从点线面体谈开发到架构师的转型》分词后生成的Token示意信息如下:

 

四、IKAnalyzer

1.简介:

IK Analyzer是一个开源的,基亍java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立亍Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

2.分词效果:

IK Analyzer 2012版本支持 细粒度切分 和 智能切分,以下是两种切分方式的演示样例。

文本1:

张三说的确实在理 

智能分词结果:

张三 | 说的 | 确实 | 在理

最细粒度分词结果:

张三 | 三 | 说的 | 的确 | 的 | 确实 | 实在 | 在理

 

 

文本原文2

公路局正在治理解放大道路面积水问题 

l   智能分词结果: 

公路局 | 正在 | 治理 | 解放 | 大道 | 路面 | 积水 | 问题

l   最细粒度分词结果: 

公路局 | 公路 | 路局 | 正在 | 治理 | 理解 | 解放 | 放大 | 大道 | 道路 | 路面 | 面积 | 积水 | 问题

3.词典的引用(结合Solr讲解)

五 、Solr

1. 什么是Solr:

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

2.工作机制:

、solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能

、业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可

  3.特点

、solr是将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品)

、solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载

、solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制

、solr支持分布式集群,索引服务的容量和能力可以线性扩展

4.Solr与Lucene的区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。

Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。

5.查询语法使用简介:

q:主查询条件。完全支持lucene语法。还进行了扩展。

fq:过滤查询。是在主查询条件查询结果的基础上进行过滤。

sort:排序条件。排序的域asc。如果有多个排序条件使用半角逗号分隔。

start, rows:分页处理。Start起始记录rows每页显示的记录条数。

fl:返回结果中域的列表。使用半角逗号分隔。

df:默认搜索域

wt:响应结果的数据格式,可以是json、xml等。

hl:开启高亮显示。

hl.fl:要高亮显示的域。

hl.simple.pre:高亮显示的前缀

hl.simple.post:高亮显示的后缀

六、ElasticSearch

  1. 什么是ES

Elaticsearch,简称为es es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本

身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实

现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得

简单。

特点:

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1以内)

  1. 存储结构:

索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索

引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这

个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索

引。

类型 type

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来

定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数

据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

文档 document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,

也可以拥有某个订单的一个文档。文档以JSONJavascript Object Notation)格式来表示,而JSON是一个到处存

在的互联网数据交互格式。在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type

映射 mapping

mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,

这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据

对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好?和建立表结构表关系数据库三范式类似。2.示例:

End

内容很简单,大家可以 有个简单的了解,内容有团队成员整理的一次分享。有问题可下方留言交流。

猜你喜欢

转载自blog.csdn.net/zzhuan_1/article/details/89215718
VS