Lucene、Solr和Elasticsearch三者的区别与联系

Lucene、solr以及elasticsearch之间的区别和联系

Lucene、Solr和Elasticsearch三者的区别与联系

全文搜索—Solr(它与lucene的关系)

三者之间的区别和概念

三者的概念:

Lucene是一套信息检索工具包,并不包含搜索引擎系统,它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用Lucene时仍需要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西。而solr和elasticsearch都是基于该工具包做的一些封装。

Solr是一个有HTTP接口的基于Lucene的查询服务器,封装了很多Lucene细节,自己的应用可以直接利用诸如 …/solr?q=abc 这样的HTTP GET/POST请求去查询,维护修改索引。

Elasticsearch也是一个建立在全文搜索引擎 Apache Lucene基础上的搜索引擎。采用的策略是分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。

首先说明三者之间的一个联系:solr和elasticsearch都是基于Lucene实现的!

solr利用zookpper进行分布式管理,而elasticsearch自身带有分布式协调管理功能;

solr比elasticsearch实现更加全面,solr官方提供的工恩能够更多,而elasticsearch本身更注 重于核心功能,高级功能多由第三方插件提供;

solr在传统的搜索应用中表现好于elasticsearch,而elasticsearch在实时搜索应用方面比solr表现好

Lucene、Solr、Elasticsearch三者的关系

Solr

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。官网地址:http://lucene.apache.org/solr/

Elasticsearch

Elasticsearch跟Solr一样,也是一个基于Lucene的全文搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。官网地址:https://www.elastic.co/products/elasticsearch

Solr的优缺点

优点:

Solr有一个更大、更成熟的用户、开发和贡献者社区。
支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
Solr比较成熟、稳定。
不考虑建索引的同时进行搜索,速度更快。

缺点:

建立索引时,搜索效率下降,实时索引搜索效率不高。

Elasticsearch的优缺点

优点:

Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。

缺点:

只有一名开发者(当前Elasticsearch GitHub组织已经不只如此,已经有了相当活跃的维护者)
还不够自动(不适合当前新的Index Warmup API)

Elasticsearch 与 Solr 的比较

二者安装都很简单;
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。

1.1 搜索引擎

可以看到搜索引擎的功能主要是三部分:

  • 爬行和抓取数据(爬虫多用Python来编写)
  • 对数据做预处理(提取文字,中文分词、建立倒排索引)
  • 提供搜索功能(用户输入关键词后,去索引库搜索数据)

在这里插入图片描述

在上述三个步骤中,java要解决的往往是后两个步骤:数据处理和搜索。

1.2 数据库搜索的问题

要实现类似百度的复杂搜索,或者京东的商品搜索,如果使用传统的数据库存储数据,那么会存在一系列的问题:

  • 数据库数据单表存储能力有限,无法存储海量数据
    • 解决大数据,可以进行分库分表。但是分库分表会增加业务复杂度
  • 搜索只能通过模糊匹配,效率极低
    • 模糊搜索可能导致全表扫描,效率非常差

在这里,比较棘手的其实是第二个问题:查询效率低,类似百度和京东这样的网站,对性能要求极高。如果用户点击搜索需要很久才能拿到数据,没人愿意一直等待下去。

那么问题来了:如何才能提高模糊搜索时的效率呢?

答案是:倒排索引技术

1.3 什么是倒排索引

倒排索引是一种存储数据的方式,与传统查找有很大区别:

  • 传统查找:采用数据按行存储,查找时逐行扫描,或者根据索引查找,然后匹配搜索条件,效率较差。概括来讲是先找到文档,然后看是否匹配。
  • 倒排索引:首先对文档数据按照id进行索引存储,然后对文档中的数据分词,记录对词条进行索引,并记录词条在文档中出现的位置。这样查找时只要找到了词条,就找到了对应的文档。概括来讲是先找到词条,然后看看哪些文档包含这些词条。

1.3.1 创建倒排索引流程

当我们需要把这些数据创建倒排索引时,会分为两步:

1)创建文档列表

首先给每一条原始的文档数据创建文档编号(docID),创建索引,形成文档列表:

在这里插入图片描述
2)创建倒排索引列表

然后对文档中的数据进行分词,得到词条。对词条进行编号,并以词条创建索引。然后记录下包含该词条的所有文档编号(及其它信息)。

在这里插入图片描述

1.3.2 搜索流程

搜索的基本流程:

  • 当用户输入任意的内容时,首先对用户输入的内容进行分词,得到用户要搜索的所有词条
  • 然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
  • 然后根据这些编号去文档列表中找到文档

举例:

例如用户要搜索关键词:拉斯跳槽

  • 首先对这句话进行分词,得到3个词条:拉斯、跳槽
  • 然后去倒排索引列表搜索(有索引,速度快),得到三个词所在的文档编号:0、2、3、4
  • 然后根据编号到文档列表查找(有索引,速度快),即可得到原始文档信息了。

2.1 什么是Lucene

在java语言中,对倒排索引的实现中最广为人知的就是Lucene了,目前主流的java搜索框架都是依赖Lucene来实现的。

其LOGO:
在这里插入图片描述

  • Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供
  • Lucene提供了一个简单却强大的应用程序接口(API),能够做全文索引和搜寻,在Java开发环境里Lucene是一个成熟的免费开放源代码工具
  • Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品
  • 官网:http://lucene.apache.org/

什么是全文检索?

其实全文检索就是利用倒排索引技术对需要搜索的数据进行处理,然后提供快速的全文匹配的技术。

3. Lucene的基本使用

下面我们来看下Lucene对于索引的增(创建索引)、删(删除索引)、改(修改索引)、查(搜索数据)。

3.1 创建索引

3.1.1 基本流程:

在这里插入图片描述
流程:

  • 准备要添加的文档数据:Document
  • 初始化索引写出工具:IndexWriter
    • 设定索引存储目录Directory
    • 设定其他配置:IndexWriterConfig
      • 设定分词器:Analyzer
      • 设定Lucene版本
  • 写出索引

3.1.2 添加依赖

在这里插入图片描述

1.1 什么是Solr

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值