在搜索这块,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)
图 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
如果我们想找包含词项"insight"的文档,我们可以扫描这个 (单词有序的) 倒排索引,找到"insight"并返回包含改词的文档 ID,示例中是 Doc 1 和 Doc 2。
为了提高可检索性 (比如希望大小写单词都返回),我们应当先分析文档再对其索引。分析包括 2 个部分:
- 将句子词条化为独立的单词
- 将单词规范化为标准形式
默认情况下,Elasticsearch 使用标准分析器,它使用了:
- 标准分词器以单词为界来切词
- 小写词条 (token) 过滤器 来转换单词