简述: Lucene 是最流行的搜索库,elasticSearch 就是基于 lucene 的分布式搜索引擎。
2)elastic search 也使用 java 开发并使用 Lucene 作为其核心来实现索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lunece 的复杂性,从而让全文搜索变得简单。
1)ElasticSearch 中的索引是组织数据的逻辑空间(好比数据库)。
每个 ElasticSearch 的索引有 1 个或者多个分片(默认是 5 个)。分片对应实际存储数据的 Lucene 的索引,分片自身就是一个搜索引擎。每个分片有 0 或者多个副本(默认一个)。
2)ElasticSearch 的索引还包含 ”type“(类似于表),用于逻辑上隔离索引中的数据。
3)在 ElasticSearch 的索引中,给定一个 type,它的所有文档会拥有相同的属性(类似于 schema)
Indices == Databases
Types == Tables
Properties == Schema
图 a 展示了一个包含 3 个分片的 ElasticSearch 索引,每个分片拥有 1 个副本。这些分片组成了一个 ElasticSearch 索引,每个分片自身是一个 Lucene 索引。
图 b 展示了 ElasticSearch 索引、分片、Lucene 索引和文档之间的逻辑关系。
Elastic Search 使用了 Apache Lucene,后者是 Doug Cutting(Apache Lucene 之父)使用 Java 开发的全文检索工具库,其内部使用的是被成为倒排索引的数据结构,其设计是为全文检索结果提供低延迟服务。
文档是 ElasticSearch 的数据单位,对文档中的词项进行分词,并创建去重词项的有序列表,将词项与其在文档中出现的位置列表关联,便形成了倒排索引(书中包含的词汇与其出现的页码列表关联)。
假设有两个文档:
- Insight Data Enginerring Fellows Program
- Insight Data Science Fellows Program
词项 | 文档 |
---|---|
data | Doc 1, Doc 2 |
enginerring | Doc 1 |
fellows | Doc 1,Doc 2 |
insight | Doc 1,Doc 2 |
program | Doc 1,Doc 2 |
science | Doc 2 |
当我们想找包含词项 insight 的文档,我们可以扫描这个倒排索引,找到 "insight" 并返回包含该词的文档 ID(Doc 1 和 Doc 2)。
为了提高可检索性,我们应当先分析文档再对其索引。
1)将句子词条化为独立的单次。
2)将单次规范化为标准形式
默认情况下,ElasticSearch 使用标准分析器:
1)标准分词器以单次为界分词
2)小写词条过滤器转换单词