elasticsearch-倒排索引原理

elasticsearch-倒排索引原理

倒排索引

Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

  1. The quick brown fox jumped over the lazy dog

  2. Quick brown foxes leap over lazy dogs in summer

为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens ),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

Term      Doc_1  Doc_2
-------------------------
Quick   |       |  X
The     |   X   |
brown   |   X   |  X
dog     |   X   |
dogs    |       |  X
fox     |   X   |
foxes   |       |  X
in      |       |  X
jumped  |   X   |
lazy    |   X   |  X
leap    |       |  X
over    |   X   |  X
quick   |   X   |
summer  |       |  X
the     |   X   |
------------------------

现在,如果我们想搜索 quick brown ,我们只需要查找包含每个词条的文档:

Term      Doc_1  Doc_2
-------------------------
brown   |   X   |  X
quick   |   X   |
------------------------
Total   |   2   |  1

两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单 相似性算法 ,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。

但是,我们目前的倒排索引有一些问题:

  • Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。

  • fox 和 foxes 非常相似, 就像 dog 和 dogs ;他们有相同的词根。

  • jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。

使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在。)只有同时出现 Quick 和 fox 的文档才满足这个查询条件,但是第一个文档包含 quick fox ,第二个文档包含 Quick foxes 。

我们的用户可以合理的期望两个文档与查询匹配。我们可以做的更好。

如果我们将词条规范为标准模式,那么我们可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档。例如:

  • Quick 可以小写化为 quick 。

  • foxes 可以 词干提取 –变为词根的格式– 为 fox 。类似的, dogs 可以为提取为 dog 。

  • jumped 和 leap 是同义词,可以索引为相同的单词 jump 。

现在索引看上去像这样:

Term      Doc_1  Doc_2
-------------------------
brown   |   X   |  X
dog     |   X   |  X
fox     |   X   |  X
in      |       |  X
jump    |   X   |  X
lazy    |   X   |  X
over    |   X   |  X
quick   |   X   |  X
summer  |       |  X
the     |   X   |  X
------------------------

这还远远不够。我们搜索 +Quick +fox 仍然 会失败,因为在我们的索引中,已经没有 Quick 了。但是,如果我们对搜索的字符串使用与 content 域相同的标准化规则,会变成查询 +quick +fox ,这样两个文档都会匹配!

https://blog.csdn.net/chuan442616909/article/details/55100757

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113133.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月23日 下午9:00
下一篇 2021年10月23日 下午10:00


相关推荐

  • 【Redis】Redis配置文件详解(很全)

    【Redis】Redis配置文件详解(很全)文章目录 Redis 配置文件 UnitsNetwork 网络相关 GENERAL 通用配置 SNAPSHOTTING 快照相关 SECURITY 安全相关 CLIENTS 客户端配置 MEMORYMANAGE 内存管理 LAZYFREEING 懒惰删除 THREADEDI OKERNELOOMCO 设置 OOM 时终止哪些进程 APPENDONLYMO 持久化配置 LUASCRIPTING LUA 脚本相关 REDISCLUSTER 集群配置 CLUSTERDOCKE NATsuppor

    2026年3月16日
    2
  • GPT-Sovits镜像使用教程

    GPT-Sovits镜像使用教程

    2026年3月16日
    4
  • 快速排序 – python版超详细讲解

    快速排序 – python版超详细讲解快速排序快速排序 英语 Quicksort 又称划分交换排序 partition exchangesort 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此达到整个数据变成有序序列 步骤为 从数列中挑出一个元素 称为 基准 pivot 重新排序数列 所有

    2026年3月20日
    2
  • Windows下创建自定义服务的正确姿势(Instrsrv&Srvany)「建议收藏」

    Windows下创建自定义服务的正确姿势(Instrsrv&Srvany)「建议收藏」总览WindowsNT工具包(WindowsNTResourceKit)提供了两个小工具,可以让我们创建自定义服务(适合于NT应用和一些16进制应用,批处理除外)。两个工具包的下载地址:CSDN下载Instrsrv.exe:从系统安装和移除服务Srvany.exe:主要作用是将任何应用程序处理成为一个可以作运行的服务明细步骤按照以下步骤操作,来创建用户自定义服务:(为…

    2022年6月1日
    40
  • 【Android】Broadcasts详解

    【Android】Broadcasts详解Android应用程序可以发送广播,也可以接收Android系统或者其它应用发出的广播,这跟发布-订阅设计模式很相似。当一些受到关心的事件发生后,广播会被自动发送。举例来说,当一些系统事件(如开机,设备开始充电等)发生,Android系统会发送广播。应用程序也可以发送自定义的广播,比如当某个应用关注的事件(如数据更新等)发生后可以发送广播提醒它。系统广播当一系列系统事件发生的时候,系统会自动发送广播

    2022年6月15日
    28
  • ProxyCFG on Win2003 和 NetSH on Win2008

    ProxyCFG on Win2003 和 NetSH on Win2008

    2021年8月6日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号