ES搜索原理
bg: 搜索的时候,使用模糊查询经常出现搜索不到的情况,不如mysql的like有效。
基础概念
- 索引(Index):相当于关系型数据库中的数据库,是一个拥有相似特征的文档的集合。例如,可以为客户数据、商品目录、订单数据等分别建立不同的索引12.
- 文档(Document):是可以被索引的基本信息单元,以 JSON 格式表示,类似于关系型数据库中的一行数据。一个文档可以包含多个字段,每个字段有其对应的值,如一篇文章、一个用户信息等都可以作为一个文档存储在 ES 中12.
- 字段(Field):组成文档的最小单位,相当于关系型数据库中的一列数据23.
- 映射(Mapping):用来定义一个文档以及其所包含的字段如何被存储和索引,包括定义字段的名称、类型,以及所使用的分词器等,类似于关系型数据库中的 Schema23.
- 分片(Shards):由于数据量可能很大,一个索引会被分成多个分片来存储在不同的节点上,以实现水平扩展和分布式存储,每个分片可以是单个节点的一部分,也可以跨越多个节点。每个分片包含一部分数据,并且每个分片都有一个主分片和一个或多个复制分片,主分片负责处理写入操作,而复制分片用于容错和读取操作13.
倒排索引(反向索引)搜索原理
倒排索引的构建过程
文档预处理阶段
- 分词(Tokenization): 将文档拆分成单词或词汇单元。这个过程使用分词器,将文本切分成有意义的词语,形成一个词汇列表。
- 去停用词(Stopword Removal): 移除常见且在搜索中没有实际意义的词语,如"的"、"是"等。这有助于提高倒排索引的效率和准确性。
- 词干提取(Stemming): 将词语还原为其词干形式,去除词尾,以便将相关的词汇映射到同一词根,减少索引的大小。
倒排生成阶段
- 建立词汇表: 将预处理后的文档中的所有唯一词语构建成一个词汇表。每个词汇都有一个唯一的标识符。+ 建立词汇表: 将预处理后的文档中的所有唯一词语构建成一个词汇表。每个词汇都有一个唯一的标识符。
- 映射关键词到文档ID: 遍历每个文档,对于文档中的每个关键词,将其映射到文档的唯一标识符(文档ID)。这样的映射关系通常以字典的形式保存。+ 映射关键词到文档ID: 遍历每个文档,对于文档中的每个关键词,将其映射到文档的唯一标识符(文档ID)。这样的映射关系通常以字典的形式保存。
- 生成倒排列表: 对于每个关键词,创建一个倒排列表,其中包含映射到该关键词的所有文档ID。倒排列表实际上是一个映射,将关键词与包含该关键词的文档关联起来。+ 生成倒排列表: 对于每个关键词,创建一个倒排列表,其中包含映射到该关键词的所有文档ID。倒排列表实际上是一个映射,将关键词与包含该关键词的文档关联起来。
检索过程分析
搜索引擎的检索过程是通过倒排索引来实现的,这个过程可以分为几个关键步骤,让我们逐步解析搜索引擎如何利用倒排索引进行检索,并强调倒排索引在快速定位相关文档方面的高效性。
1. 用户查询输入:
- 用户在搜索引擎中输入关键词或查询短语,希望找到相关的文档。
2. 关键词分析:
- 搜索引擎对用户输入的查询进行关键词分析,进行类似于文档预处理的步骤,包括分词、去停用词、词干提取等。
3. 查询到关键词的倒排列表:
- 对于每个关键词,搜索引擎通过倒排索引找到与之相关的文档ID列表。
4. 倒排列表的交集操作:
- 如果查询包含多个关键词,搜索引擎会对这些关键词的倒排列表进行交集操作,得到包含所有关键词的文档ID列表。
5. 文档排序和排名:
- 搜索引擎根据某种算法对得到的文档ID列表进行排序和排名,以便将最相关的文档排在前面。
6. 返回搜索结果:
- 最终,搜索引擎将排名最高的文档作为搜索结果返回给用户,呈现在搜索结果页面上。
倒排索引的设计使得搜索引擎能够在海量文档中迅速定位包含查询关键词的文档,因此在检索过程中具有高效性。通过直接访问倒排列表,搜索引擎可以快速获取包含关键词的文档ID,而不需要逐一扫描所有文档。这种高效的检索过程是搜索引擎能够迅速响应用户查询的关键。