在搜索这块,lucene是最流行的搜索库。

elasticSearch是基于lucene的分布式搜索引擎。在es没火的时候,大家一般用solr

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

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

1 辨析 Elasticsearch 的索引与 Lucene 的索引

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

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

Elasticsearch 的索引还包含"type"(就像数据库中的表),用于逻辑上隔离索引中的数据。

在 Elasticsearch 的索引中,给定一个 type,它的所有文档会拥有相同的属性 (就像表的 schema)

ES与lucene es与lucene关联_搜索

图 a 展示了一个包含 3 个分片的 Elasticsearch 索引,每个分片拥有 1 个副本。这些分片组成了一个 Elasticsearch 索引,每个分片自身是一个 Lucene 索引。图 b 展示了 Elasticsearch 索引、分片、Lucene 索引和文档之间的逻辑关系。

对应于关系数据库术语

Elasticsearch Index == Database 
Types == Tables 
Properties == Schema

存储模型

Elasticsearch 使用了Apache Lucene,后者是 Doug Cutting(Apache Hadoop 之父) 使用 Java 开发的全文检索工具库,其内部使用的是被称为倒排索引的数据结构,其设计是为全文检索结果的低延迟提供服务。文档是 Elasticsearch 的数据单位,对文档中的词项进行分词,并创建去重词项的有序列表,将词项与其在文档中出现的位置列表关联,便形成了倒排索引


倒排索引:书中包含的词汇与其出现的页码列表关联。当我们说文档被索引了,我们指的是倒排索引

我们来看下如下 2 个文档是如何被倒排索引的:

文档 1(Doc 1): Insight Data Engineering Fellows Program

文档 2(Doc 2): Insight Data Science Fellows Program

ES与lucene es与lucene关联_搜索_02

如果我们想找包含词项"insight"的文档,我们可以扫描这个 (单词有序的) 倒排索引,找到"insight"并返回包含改词的文档 ID,示例中是 Doc 1 和 Doc 2。 

为了提高可检索性 (比如希望大小写单词都返回),我们应当先分析文档再对其索引。分析包括 2 个部分:

  • 将句子词条化为独立的单词
  • 将单词规范化为标准形式

默认情况下,Elasticsearch 使用标准分析器,它使用了:

  • 标准分词器以单词为界来切词
  • 小写词条 (token) 过滤器 来转换单词