ElasticSearch:全文检索及倒排索引原理

这篇具有很好参考价值的文章主要介绍了ElasticSearch:全文检索及倒排索引原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ElasticSearch:全文检索及倒排索引原理,系统设计及业务积累,全文检索,elasticsearch,倒排索引

1.从全文检索说起

首先介绍一下结构化与非结构化数据:

  • 结构化数据将数据具有的特征事先以结构化的形式定义好,数据有固定的格式或有限的长度。典型的结构化数据就是传统关系型数据库的表结构,数据特征直接体现在表结构的字段上,所以根据某一特征做数据检索很直接,速度也比较快
  • 非结构化数据没有预先定义好的结构化特征,也没有固定格式和固定长度。典型的非结构化数据包括文章、图片、视频、网页、邮件等,其中像HTML网页这种具有一定格式的文档也称为半结构化数据

对于非结构化的数据检索,被称为全文检索。

假设现在MySQL中有一张User表,含有三个阶段:姓名name、年龄age和爱好favor:
ElasticSearch:全文检索及倒排索引原理,系统设计及业务积累,全文检索,elasticsearch,倒排索引

对于User表来说,整体上是结构化的,比如name、age都可以直接建立索引来快速地检索。
而其中的favor字段是一个text类型,存储的是非结构化的文本数据:
篮球、足球、爱运动的我;本人热爱学习,游戏偶尔也玩!!!!

与结构化查询相比,全文检索面临的最大问题就是性能问题。全文检索最一般的应用场景是根据一些关键字查找包含这些关键字的文档,比如互联网搜索引擎要实现的功能就是根据一些关键字查找网页。显然,如果没有对文档做特别处理,查找的办法似乎只能是逐条比对。

假设现在需要找到favor中含有“足球”这个关键字的User,那么只能使用like模糊查询:
select * from user where favor like '%足球%'

like语句是无法建立索引的,查询时会进行全表扫描,并且在每个favor字段中进行遍历匹配,以找到含有“足球”这个关键字的记录,整体复杂度特别高,所以全文检索也是MySQL这类结构关系式数据库无法很好实现的需求。

全文检索一般是查询包含某一或某些关键字记录,所以通过文档整体值建立的索引对提高查询速度是没有任何帮助的。为了解决这个问题,人们创建了一种新索引方法,这种索引方法就是倒排索引。

2.倒排索引的原理

倒排索引是为了解决上述非结构化数据的检索问题而产生的。

首先明确一下,在ES中存储记录的单位是JSON“文档”,而JSON“文档”中的“字段”也就是组成JSON的一个个KV对。

普通索引也被称为正排索引,也就是通过对主键和结构化字段建立索引,通过这些结构化索引找到文档。

倒排索引则是先将文档中包含的关键字全部提取出来,然后再将关键字与文档的对应关系保存起来,最后再对关键字本身做索引排序。用户在检索某一关键字时,可以先对关键字的索引进行查找,再通过关键字与文档的对应关系找到所在文档。

假设上述的User表通过ES存储,其中两个User文档为:

{
    "_id: 1,
    "name":"pbr1",
    "age":22,
    "favor":"篮球、足球、爱运动的我;本人热爱学习,游戏偶尔也玩!!!!"
}

{
    "_id: 2,
    "name":"pbr2",
    "age":22,
    "favor":"篮球、足球、爱运动的我"
}

其中favor定义为text类型,假设分词器进行以下分词:

  • 文档1的favor分词:“篮球”、“足球”、“爱运动的我”、“本人热爱学习”、“游戏偶尔也玩”这5个token
  • 文档2的favor分词:“篮球”、“足球”、“爱运动的我”这3个token

那么对分词token建立索引,并建立对原始文档的映射,就得到一个以favor进行分词的倒排索引:
ElasticSearch:全文检索及倒排索引原理,系统设计及业务积累,全文检索,elasticsearch,倒排索引

可以看到,倒排索引实际上就是对全文数据结构化的过程。对于存储在关系型数据库中的数据来说,它们依赖于人的预先分析将数据拆解为不同字段,所以在数据插入时就已经是结构化的;而在全文数据库中,文档在插入时还不是结构化的,需要应用程序根据规则自动提取关键字,并形成关键字与文档之间的结构化对应关系。

比如现在需要查询爱好为“篮球”和“足球”的用户,那么可以直接通过倒排索引拿到对应的文档1和文档2,也就查询到了这两个用户。

3.ES索引构建过程

全文检索中提取关键字是非常重要的一步。这些预先提取出来的关键字,在Elasticsearch及全文检索的相关文献中一般称为词项(Term),文档的词项提取在Elasticsearch中称为文档分析(Analysis),是整个全文检索中较为核心的过程。这个过程必须要区分哪些是词项,哪些不是。对于英文来说,它还必须要知道apple和apples指的同一个东西,而run和running指的是同一动作。对于中文来说就更麻烦了,因为中文词语不以空格分隔,所以面临的第一难题是如何将词语分辨出来。

ES底层使用了Lucene来构建索引,一个基本的过程是先对text类型的字段进行分词,分词使用的分词器以配置mapping时指定的为准,默认使用standard分词器,对于中文分词来说,一般建议使用ik_smart或ik_max_word分词器:

ElasticSearch:全文检索及倒排索引原理,系统设计及业务积累,全文检索,elasticsearch,倒排索引

关于Lucene如何存储这些分词解析结果可以学习这篇文章:https://www.shenyanchao.cn/blog/2018/12/04/lucene-index-files/

由于文档存储前的分析和索引过程比较耗资源,所以为了提升性能,文档在添加到ES中时并不会立即被编入索引。

默认情况下,ES会每隔1s统一处理一次新加入的文档,可以通过index.refresh_interval参数修改。

为了提升性能,在ES 7中还添加了index.search.idle.after参数,它的默认值是30s:如果索引在一段时间内没有收到检索数据的请求,那么它至少要等30s后才会刷新索引数据。

所以可以看出ES的写入操作实际上是准实时的,新添加到索引中的文档可能在一段时间内不能被检索到,如果的确需要立即检索到文档可以使用强制刷新到索引的方式,包括使用_refresh接口和在操作文档时使用refresh参数等进行强制刷新缓冲区中的索引到磁盘中。文章来源地址https://www.toymoban.com/news/detail-629925.html

到了这里,关于ElasticSearch:全文检索及倒排索引原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大文本的全文检索方案附件索引

    Elasticsearch 附件索引是需要插件支持的功能,它允许将文件内容附加到 Elasticsearch 文档中,并对这些附件内容进行全文检索。本文将带你了解索引附件的原理和使用方法,并通过一个实际示例来说明如何在 Elasticsearch 中索引和检索文件附件。 索引附件的核心原理是通过 Inges

    2024年02月12日
    浏览(34)
  • 全文检索-Elasticsearch-进阶检索

    本文记录谷粒商城高级篇的 Elasticsearch 进阶检索部分,续上之前记录的 Elasticsearch入门篇。 ES 支持两种基本方式检索 : 一个是通过使用 REST request URI 发送搜索参数(uri + 检索参数) 另一个是通过使用 REST request body 来发送它们(uri + 请求体) 请求体中写查询条件,语法: 示例

    2024年02月03日
    浏览(88)
  • Elasticsearch 全文检索 分词检索-Elasticsearch文章四

    https://www.elastic.co/guide/en/enterprise-search/current/start.html https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-match-query.html Full text Query中,我们只需要把如下的那么多点分为3大类,你的体系能力会大大提升 很多api都可以查得到,我们只要大概知道有支持哪些功能 Elasticsearch 执行

    2024年02月14日
    浏览(52)
  • MySQL全文索引:中文语义分词检索(相似度匹配)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 通常情况下,全文检索引擎我们一般会用ES组件(传送门:SpringBoot系列——ElasticSearch),但不是所有业务都有那么大的数据量、那么大的并发要求,MySQL5.7之后内置

    2023年04月09日
    浏览(43)
  • elasticsearch全文检索

    传送门 best_fields 传送门 most_fields 当查询多字段包含相同文本以不同方式分词的时候此参数最有用, 传送门 cross_fields phrase和phrase_prefix 传送门 传送门

    2024年02月07日
    浏览(47)
  • ElasticSearch-全文检索

    https://www.elastic.co/cn/what-is/elasticsearch 全文搜索属于最常见的需求,开源的Elasticsearch是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。 维基百科、StackOverflow、Github都采用它。 Elastic的底层是开源库Lucene。但是,你没法直接用Lucene,必须自己写代码去调用

    2024年04月17日
    浏览(38)
  • 图数据库Neo4J 中文分词查询及全文检索(建立全文索引)

    Neo4j的全文索引是基于Lucene实现的,但是Lucene默认情况下只提供了基于英文的分词器,下篇文章我们在讨论中文分词器(IK)的引用,本篇默认基于英文分词来做。我们前边文章就举例说明过,比如我要搜索苹果公司?首先我们要做的第一步在各个词条上创建全文索引,第二步

    2024年02月03日
    浏览(42)
  • ElasticSearch 实战:ElasticSearch文档全文检索

    Elasticsearch 实战:Elasticsearch 文档全文检索 全文检索是 Elasticsearch 的核心功能之一,它允许用户对文本内容进行高效的模糊搜索、词组匹配、同义词处理、停用词过滤等操作。以下是如何进行文档全文检索的详细步骤: **1. **全文匹配查询(Match Query) 最基础的全文检索查询是

    2024年04月11日
    浏览(51)
  • ES(Elasticsearch 全文检索)

    数据量大的时候 索引失效 =查询性能低 功能比较弱 对文档的内容进行分词,对词条创建索引,记录词条所在的文档信息根据词条查询到文档的id 从而查到文档 文档:每一条数据就是一条文档 词条:文档按照语义分成的词语 正向索引 根据文档的id创建索引 查询词条必须先找

    2024年02月05日
    浏览(58)
  • 全文检索-Elasticsearch-整合SpringBoot

    前面记录了 Elasticsearch 全文检索的入门篇和进阶检索。这次我们来讲下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服务项目中使用 ES 来实现全文检索,来达到商品检索的功能。 检索服务单独作为一个服务,就称作 gulimall-search 模块。 点击 Next 勾选 Spring Web 依赖,点击

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包