Lucene

483 阅读2分钟

简述: Lucene 是最流行的搜索库,elasticSearch 就是基于 lucene 的分布式搜索引擎。

lucene 和 elastic search 的关系
1)lucene 只是一个库。如果你想要使用他,就必须使用 java 来作为开发语言并将其直接集成到你的应用中。更糟糕的是,Lucene 非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

2)elastic search 也使用 java 开发并使用 Lucene 作为其核心来实现索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lunece 的复杂性,从而让全文搜索变得简单。

lucene 和 Elastic Search 的索引辨析

1)ElasticSearch 中的索引是组织数据的逻辑空间(好比数据库)。

每个 ElasticSearch 的索引有 1 个或者多个分片(默认是 5 个)。分片对应实际存储数据的 Lucene 的索引,分片自身就是一个搜索引擎。每个分片有 0 或者多个副本(默认一个)。

2)ElasticSearch 的索引还包含 ”type“(类似于表),用于逻辑上隔离索引中的数据。

3)在 ElasticSearch 的索引中,给定一个 type,它的所有文档会拥有相同的属性(类似于 schema)

Indices == Databases
Types == Tables
Properties == Schema
对应数据库术语

基础知识与理论;ES与lucene的关联1

图 a 展示了一个包含 3 个分片的 ElasticSearch 索引,每个分片拥有 1 个副本。这些分片组成了一个 ElasticSearch 索引,每个分片自身是一个 Lucene 索引。

图 b 展示了 ElasticSearch 索引、分片、Lucene 索引和文档之间的逻辑关系。

存储模型

Elastic Search 使用了 Apache Lucene,后者是 Doug Cutting(Apache Lucene 之父)使用 Java 开发的全文检索工具库,其内部使用的是被成为倒排索引的数据结构,其设计是为全文检索结果提供低延迟服务。

文档是 ElasticSearch 的数据单位,对文档中的词项进行分词,并创建去重词项的有序列表,将词项与其在文档中出现的位置列表关联,便形成了倒排索引(书中包含的词汇与其出现的页码列表关联)。

假设有两个文档:

  1. Insight Data Enginerring Fellows Program
  2. Insight Data Science Fellows Program
词项文档
dataDoc 1, Doc 2
enginerringDoc 1
fellowsDoc 1,Doc 2
insightDoc 1,Doc 2
programDoc 1,Doc 2
scienceDoc 2

当我们想找包含词项 insight 的文档,我们可以扫描这个倒排索引,找到 "insight" 并返回包含该词的文档 ID(Doc 1 和 Doc 2)。

为了提高可检索性,我们应当先分析文档再对其索引。

1)将句子词条化为独立的单次。

2)将单次规范化为标准形式

默认情况下,ElasticSearch 使用标准分析器:

1)标准分词器以单次为界分词

2)小写词条过滤器转换单词

引用

基础知识与理论;ES与lucene的关联