一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

这篇具有很好参考价值的文章主要介绍了一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、线上问题

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

——问题来自:死磕Elasticsearch 知识星球微信群

这个问题涉及到业务细节,至今没有定论。不过,该问题引发了我的思考。

2、我的一点思考

我们使用 Elasticsearch 到底用来做什么?

除了 Elasticsearch 早已不是10年前因“菜谱”而火出技术圈的搜索引擎组件,它早已不是“单兵作战”,而是 ELKB 形成的 Elastic Stack “行走江湖”。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

但,至少技术选型涉及到大数据的检索几乎无一例外 Elasticsearch 都是“首发阵容”。

2.1 关于全文检索,用户更关注什么?

关于全文搜索,《这就是搜索引擎》张俊林博士从搜索引擎的角度阐述了用户的关注点,核心就是两个。

  • 其一:精准率;

  • 其二:召回率。

通俗点讲:

  • 精准率是站在用户角度,召回的数据贴合用户的预期,越准确越好。

当然,大数据时代的今天,单纯的字、词匹配早已跟不上时代的步伐,基于用户行为的推荐(如:抖音、网易云音乐)往往更吊起用户的胃口。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?
  • 而召回率是满足检索条件的语句都尽可能的召回,到底要什么,让用户在结果中二次再做选择。

这两种都有应用场景,无所谓谁对谁错。

提到 Elasticsearch 精准召回数据,先不谈“精准”,先说一下召回。

如下图所示,可以分两部分看:数据的写入过程、数据检索过程。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

数据写入过程要比图中复杂,我们着重关注建立倒排索引的过程,因为后面我们要基于倒排索引做全文检索。

2.2 数据写入过程

写入的文本如下:

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

基于 ik_smart 分词后,倒排索引的中的分词词典如下所示:

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

2.3 数据检索过程

Elasticsearch 提到检索,这其实是一个大的概念,不信你看下面的脑图。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

Elasticsearch 检索从大的角度可以看成黑盒,类似:Google、baidu 搜索框。用户搜索框输入内容,检索召回数据。

但是,技术人员的眼里看搜索,更关注用哪种类型搜索。这涉及到检索分类。

Elasticsearch 检索大致可以分为:全文检索、精准匹配检索、多表关联检索、组合检索、不常用检索。

精准匹配检索回答的是“是和否、存在或不存在”问题?比如:小明的手机号为:“13566668888”,多一位、少一位、错一位都不能被召回!完全满足检索条件就召回,不满足检索条件就不要召回。不存在中间情况。

而全文检索回答的是“相关度”的问题?如文章开头提到的“手表”、“手表带”、“表带”就有相关度,哪些数据该召回?谁优先被召回(也就是谁排在前面)。

match_phrase 和 match 等实现检索的机制是不一样的,“profile:true" API 能帮我们更精细的看到底层的实现。

简单点说:match_phrase 走的是短语检索匹配,而 match 走的是多字段拆解后的 term query 的 bool 语句组合体。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

2.4 如何理解精准?

其实这个没有普适的标准,不同的业务系统是不一样的。

建议,结合业务需求、产品经理和技术经理、项目经理、核心技术人员共同敲定。

满足用户要求的“精准”才算是精准。

比如文章开头提到的“手表”,其实有多种理解?

  • 其一:只有“手表”两个字,没有任何其他,这种叫精准。

  • 其二:分词词典里有“手表”,就要召回,这种也叫精准。

  • 其三:只要文本里有就要召回,这也是某种意义的精准。比如:“南京市长江大桥”,搜索“江大桥”也要求召回。

等等......不一而足。

有了上面的思考,我们尝试解读一下开篇的问题。

3、Elasticsearch 8.X 更精准检索实现

如下示例,拿数据说话!

3.1 字词混合索引检索方案

  • 词索引——使用 ik_smart 分词。

  • 字索引——使用  standard 标准分词。

保留了 keyword 类型,便于方案二的精准字符匹配。

DELETE test-20220928
PUT test-20220928
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_smart",
        "fields": {
          "standard": {
            "type": "text",
            "analyzer": "standard"
          },
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

POST test-20220928/_bulk
{"index":{"_id":1}}
{"title":"手表带真好看"}
{"index":{"_id":2}}
{"title":"手表最近卖的不好,咋整"}
{"index":{"_id":3}}
{"title":"卡西欧手表不错哦"}
{"index":{"_id":4}}
{"title":"手表"}

先看“手表带真好看”这个文档 ik_smart 的分词结果。

其他几个文档{“2”,“3”,“4”} 都包含手表的分词,大家可以自己验证,篇幅原因,没有截图。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

如下检索是 bool 组合混合体。

对于:must 条件要求单字相连的多字(可以理解为短语,但不见得是有意义的短语,如:江大桥)必须满足,用 短语 match_phrase 进行检索。

对于:should 条件满足 ik_smart 分词存在结果,则召回数据,且极大的提升评分权重。

POST test-20220928/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "title": {
              "query": "手表",
              "boost": 50
            }
          }
        }
      ],
      "must": [
        {
          "match": {
            "title.standard": "手表"
          }
        }
      ]
    }
  }
}

明显看出来:包含手表要排在前面。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

3.2 自定义评分实现精准检索

使用前提:针对是 keyword 类型。

大家记住:sort 排序、aggregation 聚合、script 脚本都只能针对 keyword 类型,text 类型都是不支持的,除非开启“fielddata”(必要性非常小,使用场景也小,不建议开启)。

如下脚本的含义,如果字段精准匹配,没有多余字符,则评分极高,设置为1000;如果字段以给定关键词开头,则评分高,设置为500;如果属于包含关系,则评分也较高,设置为100;如果没有包含,那评分为10。

POST test-20220928/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "if(doc['title.keyword'].value == params.keyword) { return 1000; } else if(doc['title.keyword'].value.startsWith(params.keyword)){ return 500; } else if(doc['title.keyword'].value.contains(params.keyword)) { return 100; }  else { return 10;}",
        "params": {
          "keyword": "手表"
        }
      }
    }
  }
}

相当于我们人工干预了评分,基于字段精准匹配的情况实现了评分的区分。这样,最先召回的结果数据就是我们最期望的精准匹配结果了。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

4、小结

针对企业级实战问题,引发了思考,并根据思考尝试做了解答。

当然,这道业务题目会有具体的细节业务场景,还需要进一步沟通交流。

本文涉及的技术点都不复杂。包含如下:

  • 分词(中文分词器、默认分词器)

  • 组合分词(fields)

  • 组合检索

  • 排序(评分)+ 全文检索+召回

  • 自定义评分(自己定义的规则来进行数据的评分,进而将评分高的优先返回,排在前面进行返回!)

仅就本文的讨论和实现,相信你也遇到过类似问题,欢迎留言交流下你的思考!

 推荐

1、探究 | 明明存在,怎么搜索不出来呢?

2、干货 | Elasticsearch 检索类型选型指南

3、Elasticsearch 检索性能优化实战指南

4、如何从0到1打磨一门 Elasticsearch 线上直播课?

更短时间更快习得更多干货!

中国50%+Elastic认证专家出自于此!

在不确定的时代,寻求确定性!

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

比同事抢先一步学习进阶干货!文章来源地址https://www.toymoban.com/news/detail-404457.html

到了这里,关于一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 由select for update锁等待问题引发的深入思考

    关于 MySQL 的加锁机制,其实十分复杂,不同的隔离级别,是否是主键或索引,锁的粒度等等。很多工作了很多年的 MySQL DBA 也不能把各种加锁场景一一讲清楚。有时候一个简单的锁等待场景都值得深入研究,大家更多的是知其然而不知其所以然。本文介绍的是一个很常见的锁

    2024年03月09日
    浏览(30)
  • 编程示例:概率论的问题——囚犯生存概率引发的循环思考

    适用于无编程经验的初学者,目的是提供一个编程的思路。 有一个囚犯,国王打算处决他,但仁慈的国王给了他一个生还的机会。 现在摆在他面前有两个瓶子,一个里面装了50个白球,一个装了50个 黑球,这个囚犯有一个机会可以随便怎样重新分配这些球到两个瓶子 中(当

    2024年02月03日
    浏览(36)
  • 记一次线上kafka重复消费的问题解决及思考

    线上ELK日志发现kafka消费者消费到重复消息 由于生产方本身就发送了重复的消息,导致消费到重复消息 消费方采用的是循环poll的模式,具体是在多线程分租户去批量处理的消息

    2024年02月10日
    浏览(38)
  • MIT6824——lab4(实现一个分片kv存储)的一些实现,问题,和思考

    和lab3A一样,shardctler也是一个服务,由客户端调用。这个服务建立在raft集群上, 保证容错。 shardctler也应该保证 线性一致性和重复请求的问题 ,因此也需要记录clientid和messageid。 shardctler保存了当前的分片信息,称为配置 Num:当前配置号 Shards:每一个分片对应的副本组id—

    2024年02月07日
    浏览(29)
  • 一行 log 日志,引发 P1 级线上事故!

    作者:老鹰汤 链接:https://juejin.cn/post/7156439842958606349 前段时间新增一个特别简单的功能,晚上上线前 review 代码时想到公司拼搏进取的价值观临时加一行log日志,觉得就一行简单的日志基本上没啥问题,结果刚上完线后一堆报警,赶紧回滚了代码,找到问题删除了添加日志的

    2024年02月13日
    浏览(21)
  • Elasticsearch 线上实战问题及解决方案探讨

    1.1 问题描述 我有 1tb 的一个大索引若干,要迁移到另外一个新集群去,有没有好办法?reindex好像会中断...... reindex 是不是就算设置了频率也会莫名的中断,而且没地方查到错误? 1000多万 的数据,大概 80G  用 reindex 有时候都会莫名的断。 有时候是全的,有时候不全。 http

    2024年02月05日
    浏览(34)
  • 一次网络不通 “争吵” 引发的思考

    \\\"你到底在说什么啊,我 K8s 的 ecs 节点要访问 clb 的地址不通和本地网卡有什么关系...\\\" 气愤语气都从电话那头传了过来,这时电话两端都沉默了。过了好一会传来地铁小姐姐甜美的播报声打断了刚刚的沉寂「乘坐地铁必须全程佩戴口罩,下一站西湖文化广场...」。 pod 需要访

    2024年02月12日
    浏览(27)
  • 【区块链】Ankr被黑引发的思考

    三明治交易、夹子机器人、抢跑、抢新、抢购、秒杀,相信这些词你都听说过了,区块链上的各种套利操作,基本上都有一个大前提,就是监听链上最新的未打包交易,才能在第一时间抢占先机。 前段时间Ankr被黑,黑客从中获利约500万美元,然而,让人惊讶的是,另一个套

    2024年02月02日
    浏览(32)
  • 由C# yield return引发的思考

        当我们编写 C# 代码时,经常需要处理大量的数据集合。在传统的方式中,我们往往需要先将整个数据集合加载到内存中,然后再进行操作。但是如果数据集合非常大,这种方式就会导致内存占用过高,甚至可能导致程序崩溃。     C# 中的 yield return 机制可以帮助我们

    2024年02月07日
    浏览(33)
  • ChatGPT引发的人机交互发展历程与升级思考

    ChatGPT自从去年12月火爆以来一直热度不减,最近正好研读了科技之巅,书中详细阐述了人机交互、人工智能、算力算法等技术的发展历史,本文主要围绕ChatGPT引发的人机交互方面的思考。 在讨论人机交互之前,首先需要说明的一点,目前计算机发展的结果已经从原来作为科

    2023年04月24日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包