Lucene
Lucene 简介
Lucene 是一个开源的全文检索引擎工具包,最初由Doug Cutting 开发。早在1997 年,资
深全文检索专家Doug Cutting 用一个周末的时间, 使用Java 语言创作了一个文本搜索的开源
函数库,目的是为各种中小型应用软件加入全文检索功能。不久之后,Lucene 诞生了,2000
年Lucene 成为Apache 开源社区的一个子项目。随着Lucene 被人们熟知,越来越多的用户和
研发人员加入其中,完善并壮大项目的发展,Lucene 已成为最受欢迎的具有完整的查询引擎
和索引引擎的全文检索库。
Lucene 特点
1 . 稳定,索引性能高
现代硬盘上每小时能够索引150GB 以上的数据。
对内存的要求小—只需要1 MB 的堆内存。
增量索引和批量索引一样快。
索引的大小约为索引文本大小的20%30%。
2 . 高效、准确、高性能的搜索算法
• 搜索排名—最好的结果显示在最前面。
• 许多强大的查询类型:短语查询、通配符查询、近似查询、范围查询等。
• 对字段级别搜索(如标题,作者,内容)。
• 可以对任意字段排序。
• 支持搜索多个索引并合并搜索结果。
• 支持更新操作和查询操作同时进行。
• 灵活的切面、高亮、join 和group by 功能。
• 速度快,内存效率高,容错性好。
• 可选排序模型,包括向量空间模型和BM25 模型。
• 可配置存储引擎。
3. 跨平台解决方案
•作为Apache 开源许可,在商业软件和开放程序中都可以使用Lucene。
• 100%纯Java 编写。
• 对多种语言提供接口。
Lucene 架构
主要可以分为三部分
1,信息收集
2,信息处理,也就是分词创建索引的过程
3,用户查询
Lucene 索引
我们接着介绍Lucene 是如何索引文档的,索引文档就是把文档变成索引这种数据结构的过程。
文档是Lucene 索引的基本单位,比文档更小的单位是字段,字段是文档的一部分,每个
字段由3 部分组成:名称(name) 、类型(type) 和取值(value)。字段的取值一般为文本
类型(字符串、字符流等)、二进制类型和数值类型。Lucene 中的字段类型主要有以下几种:
TextField
TextField 会把该字段的内容索引并词条化,但是不保存词向量。比如,包含整篇文档内容
的body 字段,常常使用TextField 类型进行索引。
StringField
StringField 只会对该字段的内容索引,但是并不词条化,也不保存词向量。字符串的值会
被索引为一个单独的词项。比如,有个字段是国家名称,字段名为“country” ,以国家“阿
尔吉利亚”为例,只索引不词条化是最合适的。
IntPoint
IntPoint 适合索引值为int 类型的字段。
LongPoint
类似于IntPoint 。适合索引值为long的字段
FloatPoint和DoublePoint 同上
SortedDocValuesField
存储值为文本内容的DocValue 字段,SortedDocValuesField 适合索引字段值为文本内容并
且需要按值进行排序的字段。
NumericDocValuesField
存储单个数值类型的DocValues 字段,主要包括(int,long , float , double ) 。
• SortedNumericDocValuesField
存储数值类型的有序数组列表的DocValues 字段。
• StoredField
StoredField 适合索引只需要保存字段值不进行其他操作的字段。
注:DocValues 是Lucene 4.X 版本以后新增的重要特性,我们都知道,Lucene 是使用经
典的倒排索引的模式来达到快速检索的目的,简单地说,就是建立词项和文档id 的关系映射,
在搜索时,通过类似hash 算法来快速定位到一个搜索关键词,然后读取文档id 集合,这样搜
索数据是非常高效快速的, 当然它也存在一定的缺陷。假如我们需要对数据做一些聚合操作,
例如排序、分组时, Lucene 内部会遍历提取所有出现在文档集合的排序字段,然后再次构建
一个最终的排好序的文档集合,这个过程全部维持在内存中操作,而且如果排序数据量巨大的
话,非常容易造成内存溢出和性能缓慢。基于此,在lucene 4.X 之后出现了DocValues 这一新
特性,DocValues 其实是Lucene 在构建索引时额外建立一个有序的基于document=>field/value
的映射列表。在构建索引时会对幵启docvalues 的字段额外构建一个已经排好序的文档到字段
级别的一个列式存储映射,它减轻了在排序和分组时对内存的依赖,而且大大提升了这个过程
的性能,当然它也会耗费一定的磁盘空间。
Elasticsearch 概述
Elasticsearch 是一个基于Lucene 的搜索服务器,釆用Java 语言编写,使用Lucene 构建索
引、提供搜索功能,并作为Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引
擎。我们知道,Lucene 提供的功能已经很强大了,但是Lucene 只是一个由Java 语言编写的库,
对不使用Java 语言的开发人员并不友好,Elasticsearch 在 Lucene 的基础上做了更多的改进,
提供了多种语言接口。如图4-1 所示,Lucene 之于 Elasticsearch 堪比发动机之于汽车,
Elasticsearch 底层使用的仍然是Lucene 的 API Lucene 专注于底层搜索的建设,Elasticsearch
专注于企业应用。
Elasticsearch 的目标是让全文搜索变得简单,开发者可以通过简单明了的RESTFul API 轻
松地实现搜索功能,而不必去面对Lucene 的复杂性。
架构解读
Gateway
这一层是用来存储索引的文件系统。支持多种方式的存储。Local FileSystem 是存储在本机的文件系统。Shared FileSystem 是共享存储。 另外支持Hadoop HDFS存储以及Amazon s3存储。
分布式Lucene 引擎
Gateway 的上层是一个分布式的Lucene 框架,Elasticsearch 的底层API 是由Lucene 提供
的, 每一个Elasticsearch 节点上都有一个Lucene 引擎的支持。
模块
在上层是一系列的模块,如索引模块、查询模块、解析映射模块,第三方模块等。在2.X之后River(第三方)模块不在使用。
Discovery和Script
模块上层是Discovery和Script。Discovery是ES的节点发现模块,不同机器上的ES节点组成集群需要进行通信,要选举出master节点,这些都是Discovery模块完成的。Script模块用来支持JavaScript和python的多语言。
在上层是传输层和JMX管理层。传输协议支持thrift、memcached、http,默认的是HTTP。JMX是Java进程的管理框架,用来管理ES应用。
最上层是ES对外的restful接口输出。
ES的优点
• 分 布 式:Elasticsearch 横向扩展非常灵活,当数据规模比较小的时候可以使用小规模的集
群。随着数据的增长,需要更大的容量和更高的性能, 此时只需增加更多的节点,
Elasticsearch 的自动发现机制会识别新增的节点并重新平衡分配数据。
• 全 文 检 索:Apache Lucene 是一个用Java 编写的高性能的功能齐全的信息检索库,
Elasticsearch 在后台使用Lucene 来提供最强大的全文检索,提供任何幵源产品的能力。自带
多语言支持、强大的查询语言、地理位置支持、上下文感知的建议、自动完成和搜索片段。
• 近实时搜索和分析:数据从进入Elasticsearch 可达到近实时搜索。除了搜索,Elasticsearch
也可以进行聚合分析操作。
• 高可用:高可用主要体现在容错机制上,Elasticsearch 集群会自动发现新的或失败的节点,
重组和重新平衡数据,确保数据是安全的和可访问的。
• 模 式 自 由:Elasticsearch 的动态mapping 机制可以自动检测数据的结构和类型,创建索引,
并使数据可搜索。
• RESTful API Elasticsearch 是 API 驱动。几乎任何操作都可以用一个简单的RESTftil API
使用JSON 基于HTTP 请求来实现,客户端也可使用多种编程语言。
ES的使用场景
1,站内搜索
Elaticsearch 在站内搜索中应用十分广泛,大部分网站尤其是网页信息量较大的网站,都
会有站内全文检索这一功能,目的是为了方便用户快速检索信息。
2,Nosql数据库
3,日志分析
例如ELK stack