【手把手】ElasticSearch的搜索推荐相关

这篇具有很好参考价值的文章主要介绍了【手把手】ElasticSearch的搜索推荐相关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能,即在用户输入搜索的过程中,进行自动补全或者纠错。以此来提高搜索文档的匹配精准度,进而提升用户的搜索体验,这就是Suggest。

term suggester

term suggester正如其名,只基于tokenizer之后的单个term去匹配建议词,并不会考虑多个term之间的关系。

POST /<index>/_search

  "suggest": {
    "<suggest_name>": {
      "text": "<search_content>",
      "term": {
        "suggest_mode": "<suggest_mode>",
        "field": "<field_name>"
      }
    }
  }
}

  • text:用户搜索的文本
  • field:要从哪个字段选取推荐数据
  • analyzer:使用哪种分词器
  • size:每个建议返回的最大结果数
  • sort:如何按照提示词项排序,参数值只可以是以下两个枚举:
    • score:分数>词频>词项本身
    • frequency:词频>分数>词项本身
  • suggest_mode:搜索推荐的推荐模式,参数值亦是枚举:
    • missing:默认值,仅为不在索引中的词项生成建议词
    • popular:仅返回与搜索词文档词频或文档词频更高的建议词
    • always:根据 建议文本中的词项 推荐 任何匹配的建议词
  • max_edits:可以具有最大偏移距离候选建议以便被认为是建议。只能是1到2之间的值。任何其他值都将导致引发错误的请求错误。默认为2
  • prefix_length:前缀匹配的时候,必须满足的最少字符
  • min_word_length:最少包含的单词数量
  • min_doc_freq:最少的文档频率
  • max_term_freq:最大的词频

演示索引的数据类型

【手把手】ElasticSearch的搜索推荐相关

【手把手】ElasticSearch的搜索推荐相关

"suggest_mode": "missing",默认值就是missing,意思就是当搜索的文本和索引100%精准匹配的时候,就没有建议的必要了。对于搜索baoqing,可能以为你想要搜索的是baoqiang、baoqian、baoqia;但对于搜索baoqiang来说,和索引100%匹配,以为你就是要搜索baoqiang。

【手把手】ElasticSearch的搜索推荐相关

"min_doc_freq": 2,这个是大于的关系,不包含等于。意思是搜索的文本匹配到的文档数要大于2才返回。

【手把手】ElasticSearch的搜索推荐相关

"suggest_mode": "popular",这玩意儿说人话其实就是返回的建议词中不包含搜索词。

【手把手】ElasticSearch的搜索推荐相关

"suggest_mode": "always",对返回的建议词不做任何的限制。

phrase suggester

term suggester可以对单个term进行建议或纠错,不会考虑多个term之间的关系。但是phrase suggester在term suggester基础上会考虑多个term之间的关系,比如是否同时出现一个索引原文中,相邻成都以及词频等。phrase suggester和term suggester相比,对建议的文本会参考上下文,也就是一个句子的其他token,不只是单纯的token距离匹配,它可以基于共生和频率选出更好的建议。

  • real_word_error_likelihood: 此选项的默认值为 0.95。此选项告诉 Elasticsearch 索引中 5% 的术语拼写错误。这意味着随着这个参数的值越来越低,Elasticsearch 会将越来越多存在于索引中的术语视为拼写错误,即使它们是正确的
  • max_errors:为了形成更正,最多被认为是拼写错误的术语的最大百分比。默认值为 1
  • confidence:默认值为 1.0,最大值也是。该值充当与建议分数相关的阈值。只有得分超过此值的建议才会显示。例如,置信度为 1.0 只会返回得分高于输入短语的建议
  • collate:告诉 Elasticsearch 根据指定的查询检查每个建议,以修剪索引中不存在匹配文档的建议。在这种情况下,它是一个匹配查询。由于此查询是模板查询,因此搜索查询是当前建议,位于查询中的参数下。可以在查询下的“params”对象中添加更多字段。同样,当参数“prune”设置为true时,我们将在响应中增加一个字段“collate_match”,指示建议结果中是否存在所有更正关键字的匹配
  • direct_generator:phrase suggester使用候选生成器生成给定文本中每个项可能的项的列表。单个候选生成器类似于为文本中的每个单独的调用term suggester。生成器的输出随后与建议候选项中的候选项结合打分。目前只支持一种候选生成器,即direct_generator。建议API接受密钥直接生成器下的生成器列表;列表中的每个生成器都按原始文本中的每个项调用。

phrase suggester在使用之前先创建一个特定的mapping

【手把手】ElasticSearch的搜索推荐相关

值得注意的是,过滤器使用的是shingle,最小和最大值分别是2和3,测试一下

【手把手】ElasticSearch的搜索推荐相关

明明最小值是2,为什么还有一个单词的拆分粒度。因为shingle要求是必须要保持一元组的,就是无论最小值和最大值是多少,一定会有单个单词的拆分。可以通过"output_unigrams": false指定关闭保留一元组,这个强烈建议不要关闭,应该保留。

【手把手】ElasticSearch的搜索推荐相关

"highlight": {
    "pre_tag": "<em>",
    "post_tag": "</em>"
}

使用高亮属性可以将被纠正的词在返回中高亮显示提示用户

【手把手】ElasticSearch的搜索推荐相关

首先,返回结果中的"text" : "lucene and elasticsearch",这个text并不一定就是文档,和存储的数据不一定就是一样的,只是ES认为你可能想要搜索的文本而已。而且对于ES来说,纠正的词越多,他会认为纠正过的词可信度越高,所以越是纠正的多的,纠正的离谱的,就越会被放在前面推荐使用。

completion suggester

前面两个suggester其实使用的频率很低,说到suggester那基本都是completion suggester的天下。completion suggester基于内存而非索引,性能强悍,不过需要结合特定的completion类型,只适合前缀搜索,并不支持中缀和后缀搜索。

completion suggester可以自动补全,自动完成,支持三种查询【前缀查询(prefix)模糊查询(fuzzy)正则表达式查询(regex)】 ,主要针对的应用场景就是"Auto Completion"。 此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。因此实现上它和前面两个Suggester采用了不同的数据结构,索引并非通过倒排来完成,而是将analyze过的数据编码成FST和索引一起存放。对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。但是FST只能用于前缀查找,这也是Completion Suggester的局限所在。

  • completion:es的一种特有类型,专门为suggest提供,基于内存,性能很高。
  • prefix query:基于前缀查询的搜索提示,是最常用的一种搜索推荐查询。
    • prefix:客户端搜索词
    • field:建议词字段
    • size:需要返回的建议词数量(默认5)
    • skip_duplicates:是否过滤掉重复建议,默认false
  • fuzzy query
    • fuzziness:允许的偏移量,默认auto
    • transpositions:如果设置为true,则换位计为一次更改而不是两次更改,默认为true。
    • min_length:返回模糊建议之前的最小输入长度,默认 3
    • prefix_length:输入的最小长度(不检查模糊替代项)默认为 1
    • unicode_aware:如果为true,则所有度量(如模糊编辑距离,换位和长度)均以Unicode代码点而不是以字节为单位。这比原始字节略慢,因此默认情况下将其设置为false。
  • regex query:可以用正则表示前缀,不建议使用

指定completion suggester的mapping

【手把手】ElasticSearch的搜索推荐相关

【手把手】ElasticSearch的搜索推荐相关【手把手】ElasticSearch的搜索推荐相关

completion suggester的速度快是通过大量内存换来的,并且只能支持前缀搜索,如果用户输入的不是前缀,召回率可能很低。所以几个suggester应该配合着使用:当使用completion没有结果的时候,应该考虑加入fuzzy参数来纠错,还没有结果的话可以考虑使用term suggester

context suggester

completion suggester通过映射上下文来实现,在索引和查询启用上下文的完成字段时,必须提供上下文。添加上下文呢映射会增加completion的字段的索引大小,并且这一代过程发生在堆中。完成建议者会考虑索引中的所有文档,但是通常来说,我们在进行智能推荐的时候最好通过某些条件过滤,并且有可能会针对某些特性提升权重。

  • contexts:上下文对象,可以定义多个
    • name:context的名字,用于区分同一个索引中不同的context对象。需要在查询的时候指定当前name
    • type:context对象的类型,目前支持两种:category和geo,分别用于对suggest item分类和指定地理位置。
    • boost:权重值,用于提升排名
  • path:如果没有path,相当于在PUT数据的时候需要指定context.name字段,如果在Mapping中指定了path,在PUT数据的时候就不需要了,因为 Mapping是一次性的,而PUT数据是频繁操作,这样就简化了代码。

 指定context suggester的mapping

【手把手】ElasticSearch的搜索推荐相关

定义一个名为 place_type 的类别上下文,其中类别必须与建议一起发送;
定义一个名为 location 的地理上下文,类别必须与建议一起发送。

【手把手】ElasticSearch的搜索推荐相关

使用boost增加权重,在返回数据集中优先排序。文章来源地址https://www.toymoban.com/news/detail-468369.html

到了这里,关于【手把手】ElasticSearch的搜索推荐相关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 手把手教程:Linux使用docker安装ElasticSearch8.2.3和配套Kibana

    前言 之前用的es一直是比较老的版本,最近做项目的时候觉得该用一个稍微新一点的了,就琢磨了一下新版本的使用,顺便整理下安装流程。之所以要整理这个,是因为新版本的ES跟老版本的安装过程差别太大了,特别是要配套Kibana的情况下。 开放端口 在云服务器控制台配置

    2024年02月11日
    浏览(7)
  • 五音不全?手把手教你用自己声音唱任何歌;最详细的Auto-GPT整理;4月AI绘画模型推荐;HayoAI平台简直太酷了 | ShowMeAI日报

    五音不全?手把手教你用自己声音唱任何歌;最详细的Auto-GPT整理;4月AI绘画模型推荐;HayoAI平台简直太酷了 | ShowMeAI日报

    👀 日报周刊合集 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! OpenAI 近期面向部分用户发放了 Code Interpreter (代码解释器) 插件使用权限,推上目前满屏惊讶脸 😮 拿到权限的用户,展示了使用 Code Interpreter插件进行的诸多尝试: 1 . 处理图片。输出动态二维码

    2024年02月09日
    浏览(6)
  • 手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)

    手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)

            在我以前的作品里有关于RRT算法的视频和代码,今天主要讲解一下RRT*算法的原理。RRT*算法主要是在RRT算法的基础上加上了重写父节点和随机重连的两个步骤。具体的实现方式我想以视频的方式向大家讲解,个人感觉讲解的十分详细。视频连接在这里,希望大家看

    2024年04月17日
    浏览(41)
  • tps5430手把手教学

    tps5430手把手教学

    TPS5430手把手教学 目录 一、buck电路原理 二、tps5430芯片介绍 1.1芯片引脚图 1.2芯片引脚说明 三、tps5430参考电路讲解以及PCB布局 1.正压降压(15V转12V) 1.1原理图 1.2器件选择 1.3PCB布局 2.正压降负压 2.1原理图 2.2PCB布局 2.3注意事项 BUCK电路原理: BUCK电路,又称降压式变换电路,

    2023年04月20日
    浏览(5)
  • 手把手pip安装教程

    在Python中,pip是最常用的包管理工具之一。它可以用于安装、卸载和管理Python包。在本文中,我们将手把手教你如何安装pip,以便能够更方便地安装和管理Python包。 在安装pip之前,我们需要确认已经正确安装了Python,并确定其版本。在命令行中输入以下命令,确认Python版本:

    2024年02月11日
    浏览(13)
  • 【算法】手把手学会BFS

    【算法】手把手学会BFS

    目录 简介 层序遍历 例题 献给阿尔吉侬的花束 全球变暖 🍦宽度优先搜索算法(又称广度优先搜索)是 最简便的图的搜索算法之一 ,之前我们在实现对树的层序遍历时就使用过它。不仅如此它还在求最短路径,找连通块时具有奇效。 🍦层序遍历基本上借助于队列,将队头

    2023年04月09日
    浏览(9)
  • 手把手实现一个lombok

    手把手实现一个lombok

    什么是JSR ? JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。 有超过300的JSR。一些更为明显的JSRs包括: 的JSR# 规格或技术 1 实时规范为Jav

    2023年04月23日
    浏览(12)
  • 【算法】手把手学会前缀和

    【算法】手把手学会前缀和

    目录 前缀和 前缀和的好处 公式的推导 例题:前缀和 二维前缀和 推导公式  例题: 子矩阵的和 🎵前缀和算法可以理解为是一种 以空间换时间的方式 ,通过建立一个新的数组来 存储从头到当前位置的数据的总和 。 初始化数组  🎵前缀和数组的初始化就是将前  i  个数存

    2024年01月17日
    浏览(5)
  • 【算法】手把手学会二分查找

    【算法】手把手学会二分查找

    目录 简介 基本步骤 第一种二分 第二种二分  例题 搜索插入位置 数的范围 总结  🥥二分查找,又叫折半查找,通过找到数据二段性每次都能将原来的数据筛选掉一半,通过这个算法我们能够将一个一个查找的  O(n)  的时间复杂度优化到  O(logn)  ,极大地提升了查找的效率

    2023年04月08日
    浏览(3)
  • 手把手教你暴力破解

    手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

    2024年02月07日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包