Elasticsearch Suggester

Elasticsearch里设计了4 种类别的 Suggester

  • Term Suggester:词条建议器。对给输入的文本进进行分词,为每个分词提供词项建议。
  • Phrase Suggester:短语建议器,在term的基础上,会考量多个term之间的关系
  • Completion Suggester:它主要针对的应用场景就是"Auto Completion"
  • Context Suggester:上下文建议器

Term Suggester

每个 token 挑选 options 里的词,组合在一起返回给用户前端即可。

blogs 索引:text 字段。

PUT /blogs/
{"mappings": {"tech": {"properties": {"body": {"type": "text"}}}}
}

Term suggester 查询:使用 suggest 这种特殊的查询。

suggest_mode:

  • missing: 只有词典里找不到词,才会为其提供相似的选项。
  • popular:仅提供在索引词典中出现的词语。只返回在更多的文档中出现的建议词
  • always:不管 token 是否存在于索引词典里都要给出相似项。
POST /blogs/_search
{ "suggest": {// 自定义名称"my-suggestion": {// query "text": "lucne rock",// 表示 term suggester"term": {// 如果 query word 足够精准,就不需要 sug 了,也就是只会 sug,word 不全匹配的。"suggest_mode": "missing",// sug 的字段"field": "body"}}}
}

两个term的相似性是如何判断的?

ES使用了一种叫做 Levenstein edit distance的算法:其核心思想就是一个词改动多少个字符就可以和另外一个词一致。与编辑距离类似。

Phrase Suggester

Phrase suggester在Term suggester的基础上,会考量多个term之间的关系,比如是否同时出现在索引的原文里,相邻程度,以及词频等等。

POST /blogs/_search
{"suggest": {"my-suggestion": {"text": "lucne and elasticsear rock","phrase": {"field": "body","highlight": {"pre_tag": "<em>","post_tag": "</em>"}}}}
}

执行结果:

"suggest": {"my-suggestion": [{"text": "lucne and elasticsear rock","offset": 0,"length": 26,"options": [{"text": "lucene and elasticsearch rock","highlighted": "<em>lucene</em> and <em>elasticsearch</em> rock","score": 0.004993905},{"text": "lucne and elasticsearch rock","highlighted": "lucne and <em>elasticsearch</em> rock","score": 0.0033391973},{"text": "lucene and elasticsear rock","highlighted": "<em>lucene</em> and elasticsear rock","score": 0.0029183894}]}]}

因为 lucene 和 elasticsearch 曾经在同一条原文里出现过,同时替换 2 个 term 的可信度更高,所以打分较高,排在第一位返回

Phrase suggester 有相当多的参数用于控制匹配的模糊程度

Completion Suggester

基于内存 FST 的数据结构,只能进行前缀检索

需要专门字段类型:completion

创建索引

PUT music
{"mappings": {"song" : {"properties" : {"suggest" : {"type" : "completion"},"title" : {"type": "keyword"}}}}
}

插入数据:可以指定权重

PUT music/song/1?refresh
{"suggest" : {"input": [ "Nevermind", "Nirvana" ],"weight" : 34}
}

搜索:在检索时 Query 也会经过 analyze 阶段,也会讲 Query 中停用词剔除。

POST blogs_completion/_search?pretty
{ "size": 0,"suggest": {"blog-suggest": {"prefix": "elastic i","completion": {"field": "body"}}}
}

值得注意的一点是 Completion Suggester 在索引原始数据的时候也要经过 analyze 阶段,取决于选用的analyzer不同,某些词可能会被 转换,某些词可能 被去除,这些会影响 FST 编码结果,也会 影响查找匹配的效果。

比如:english analyzer会剥离掉 stop word,而 is 就是其中一个,被剥离掉了!

结果:

"suggest": {"blog-suggest": [{"text": "elastic i","offset": 0,"length": 9,"options": [{"text": "Elastic is the company behind ELK stack","_index": "blogs_completion","_type": "tech","_id": "AVrXFyn-cpYmMpGqDdcd","_score": 1,"_source": {"body": "Elastic is the company behind ELK stack"}}]}]}
  • skip_duplicates:是否应过滤掉重复的建议(默认为false)。

支持拼音

如果要支持拼音:

下载拼音插件:wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.4.0/elasticsearch-analysis-pinyin-7.4.0.zip

当我们创建索引时可以自定义分词器,通过指定映射去匹配自定义分词器

支持模糊搜索

fuzzy

POST music/_search?pretty
{"suggest": {"song-suggest": {"prefix": "nor","completion": {"field": "suggest","fuzzy": {"fuzziness": 2}}}}
}
  • fuziness 为1,表示是针对每个词语而言的,而不是总的错误的数值。

模糊性是拼写错误的简单解决方案,但具有很高的 CPU 开销和非常低的精度。

支持正则

POST music/_search?pretty
{"suggest": {"song-suggest": {"regex": "n[ever|i]r","completion": {"field": "suggest"}}}
}

Context Suggester

completion suggester 是在索引中所有文档进行匹配,有时我们希望在一个增加过滤条件,以提高搜索的准确度。

有两种类型:categorygeo

PUT place
{"mappings": {"shops" : {"properties" : {"suggest" : {"type" : "completion","contexts": [{ # 1"name": "place_type","type": "category","path": "cat"},{ # 2"name": "location","type": "geo","precision": 4}]}}}}
}

类别上下文(Category Context

插入数据:这些 suggestions 将与 cafe 和 food 类别相关联。

PUT place/shops/1
{"suggest": {"input": ["timmy's", "starbucks", "dunkin donuts"],"contexts": {"place_type": ["cafe", "food"]}}
}

查询:suggestions可以按一个或多个类别进行过滤。 以下过滤了多个类别的suggestions

POST place/_suggest?pretty
{"suggest" : {"prefix" : "tim","completion" : {"field" : "suggest","size": 10,"contexts": {"place_type": [ "cafe", "restaurants" ]}}}
}

注意:当在查询时未提供类别时,将考虑所有索引文档。 应避免在类别启用完成字段上没有类别的查询,因为它会降低搜索性能。

Boost 类别提权:

对某些类别的suggestions可以比其他类别更高。 以下内容按类别过滤suggestions,并增加与某些类别相关联的suggestions

POST place/_suggest?pretty
{"suggest" : {"prefix" : "tim","completion" : {"field" : "suggest","size": 10,"contexts": {"place_type": [{ "context" : "cafe" },{ "context" : "restaurants", "boost": 2 }]}}}
}
  • context,要过滤/提升的类别的值,这是强制性的。
  • boost,应该提高建议分数的因素,通过将boost乘以建议权重来计算分数,默认为1。
  • prefix,是否应该将类别实为前缀,例如,如果设置为true,则可以通过指定类型的类别前缀来过滤type1,type2等类别,默认为false。

地理位置上下文

一个geo上下文允许我们将一个或多个地理位置或geohash与在索引时间的建议关联,在查询时,如果建议位于地理位置特定的距离内,则可以过滤和提升建议。

在内部,地位置被编码为具有指定精度的地理位置。

地理上下文可以利用suggestions被显式地设置或者经由路径参数从文档中的地理点字段索引,类似于类别上下文。 将多个地理位置上下文与suggestion关联,将对每个地理位置的suggestion建立索引。 以下对具有两个地理位置上下文的suggestion进行索引:

插入数据:

PUT place/shops/1
{"suggest": {"input": "timmy's","contexts": {"location": [{"lat": 43.6624803,"lon": -79.3863353},{"lat": 43.6624718,"lon": -79.3873227}]}}
}

查询

suggestions可以根据它们与一个或多个地理点的接近程度而被过滤和提升。 以下过滤suggestions落在由地理点的编码geohash表示的区域内:

POST place/_suggest
{"suggest" : {"prefix" : "tim","completion" : {"field" : "suggest","size": 10,"contexts": {"location": {"lat": 43.662,"lon": -79.380}}}}
}

当指定在查询时具有较低精度的位置时,将考虑落入该区域内的所有suggestions

位于由geohash表示的区域内的suggestions也可以比其他suggestion更高,如下所示:

POST place/_suggest?pretty
{"suggest" : {"prefix" : "tim","completion" : {"field" : "suggest","size": 10,"contexts": {"location": [{"lat": 43.6624803,"lon": -79.3863353,"precision": 2},{"context": {"lat": 43.6624803,"lon": -79.3863353},"boost": 2}]}}}
}

上下文查询过滤的suggestions落在由(43.662,-79.380)的geohash表示的地理位置(精度为2)下方的suggestions,并提升落在(43.6624803,-79.3863353)的geohash表示形式下的默认精度为6的suggestions乘以因子2。

总结

  1. 在用户刚开始输入的过程中,使用 Completion Suggester 进行关键词前缀匹配、,刚开始匹配项会比较多,随着用户输入字符增多,匹配项越来越少。如果用户输入比较精准,可能 Completion Suggester 的结果已经够好,用户已经可以看到理想的备选项了。
  2. 如果 Completion Suggester 已经到了零匹配,那么可以猜测是否用户有输入错误,这时候可以尝试一下 Phrase Suggester
  3. 如果 Phrase Suggester没有找到任何 option,开始尝试 Term Suggester
  4. 需要一个搜索词库/语料库,不要和业务索引库在一起,方便维护和升级语料库
  5. 支持拼音插件

精准程度上( Precision )看: Completion > Phrase > Term,召回率上( Recall )则反之。从性能上看,Completion Suggester是最快的,如果能满足业务需求,只用 Completion Suggester 做前缀匹配是最理想的。 Phrase 和 Term 由于是做倒排索引的搜索,相比较而言性能应该要低不少,应尽量控制 Suggester 用到的索引的数据量,最理想的状况是经过一定时间预热后,索引可以全量 map 到内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析计数排序:原理、特性与应用

目录 &#x1f4af;引言 &#x1f4af;计数排序的原理 ⭐核心概念 ⭐工作流程 1.确定计数范围 2.统计元素出现次数 3.计算累计计数 4.放置元素到正确位置 &#x1f4af;计数排序的实现 ⭐代码示例&#xff08;以 C 为例&#xff09; ⭐时间复杂度分析 ⭐稳定性分析…

【AI学习】Mamba学习(七):HiPPO通用框架介绍

HiPPO这篇论文《HiPPO: Recurrent Memory with Optimal Polynomial Projections》&#xff0c;提出了一个通用框架。 我们再重新看一下论文的摘要&#xff1a; 从连续数据中学习的一个核心问题是&#xff0c;随着更多数据的处理&#xff0c;以增量方式表示累积历史。我们介绍了…

「规模焦虑」如影随形,库迪咖啡想靠便捷店突围能行吗?

作者 | 辰纹 来源 | 洞见新研社 “我有一个广东的小兄弟&#xff0c;做了9年的奶茶&#xff0c;后来因为觉得咖啡是一个上升期的赛道&#xff0c;所以毅然决然拿了45万加盟了库迪咖啡&#xff0c;结果全亏损完了&#xff0c;相当于只买了一个配方。” 抖音博主茶饮圈大山哥分…

Vite创建Vue3项目以及Vue3相关基础知识

1.创建Vue3项目 1.运行创建项目命令 # 使用 npm npm create vitelatest2、填写项目名称 3、选择前端框架 4、选择语法类型 5、按提示运行代码 不出意外的话&#xff0c;运行之后应该会出现 下边这个页面 6.延伸学习&#xff1a;对比webpack和vite&#xff08;这个是面试必考…

【微服务】springboot远程docker进行debug调试使用详解

目录 一、前言 二、线上问题常用解决方案 2.1 微服务线上运行中常见的问题 2.2 微服务线上问题解决方案 2.3 远程debug概述 2.3.1 远程debug原理 2.3.2 远程debug优势 三、实验环境准备 3.1 搭建springboot工程 3.1.1 工程结构 3.1.2 引入基础依赖 3.1.3 添加配置文…

400行程序写一个实时操作系统(九):替换FreeRTOS的内存管理算法

前言 通过前面几章&#xff0c;笔者带领大家完成了内存管理算法的编写。 我们完成的内存管理算法&#xff0c;被称为小内存管理算法。我们也可以将它作为一个库&#xff0c;在后续的嵌入式开发中&#xff0c;使用我们自己编写的malloc&#xff0c;不仅效率会更高&#xff0c;…

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单&#xff0c;有很大限制&#xff0c;我们需要更多复杂模式 蓝色是线性模型&#xff0c;线性模型无法去表示…

如何匿名浏览网站,保护在线隐私?

在现如今的网络世界&#xff0c;在线隐私已不复存在。你总是被跟踪&#xff0c;即使你使用隐身模式也无济于事。隐身模式会阻止浏览器保存你的浏览历史记录。但它并不能阻止你的互联网服务提供商 (ISP)、雇主、学校、图书馆或你访问的网站看到你在网上做什么。 更有不法分子在未…

Lumerical学习——资源管理和运行模拟

一、资源管理&#xff08;Resource Manager&#xff09; 在模拟计算前必须对计算资源进行配置。采用资源管理器可以完成这项任务。单击主工具条的“资源&#xff08;Resources&#xff09;”按钮&#xff08;见上图&#xff09;就可以打开资源管理器。通常每个计算机只需设置一…

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售&#xff0c;因此内部会再细分为多个管理单位&#xff0c;包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上&#xff0c;大型生物制药企业会设立实验室、研发…

摇人摇人, JD内推岗位(社招+校招)

摇人摇人, 有找工作的家人们看过来啊~ 虚位以待, 快到碗里来 算法开发工程师岗 京东云 北京|T7, 5-10年 岗位职责&#xff1a; 参与基于RAG知识库平台和ChatBI产品打造和商业化落地&#xff0c;进行相关技术&#xff1a;包括OCR、文档拆分、意图理解、多轮对话、NL2SQL、Embed…

mysql用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

Linux性能调优,还可以从这些方面入手

linux是目前最常用的操作系统&#xff0c;下面是一些常见的 Linux 系统调优技巧&#xff0c;在进行系统调优时&#xff0c;需要根据具体的系统负载和应用需求进行调整&#xff0c;并进行充分的测试和监控&#xff0c;以确保系统的稳定性和性能。同时&#xff0c;调优过程中要谨…

万界星空科技:智能称重打标系统

万界星空科技的称重系统是其为制造业&#xff0c;特别是线缆、漆包线、食品等行业提供的重要解决方案之一。以下是对该系统的详细介绍&#xff1a; 一、系统概述 万界星空科技称重系统是集成在其MES&#xff08;制造执行系统&#xff09;中的一个功能模块&#xff0c;专门用于…

基于springboot实习管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写&#xff0c;挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…

2020年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI参考模型网络协议的三要素 网络协议的三要素&#xff1a;语法 &#xff0c;语义&#xff0c;同步&#xff08;时序&#xff09; 语法&#xff1a;定义收发双方所交换信息的格式 语法&#xff1a;定义收发双方所要完成的操作 网页的加载 …

深入理解队列(Queue)的实现(纯小白进)

目录&#xff1a; 前言一、 什么是队列?1.1、 队列的特性1.2、 队列的图解 二、 队列的详细实现2.1、 队列不同的实现方式2.2、 队列结构体2.3、 队列的初始化2.4、 入队列2.5、 出队列2.6、 获取对头元素2.7、 获取队尾元素2.8、 队列的判空2.9、 队列有效的元素个数2.10、 队…

Kind部署的K8s证书过期后的解决方案

证书通常有效期为1年&#xff0c;一年后服务将不可用解决方案就是更新证书 1. 找到 Kind 集群的控制平面容器名称,容器名称不一定是这个 docker ps --filter "namekind-control-plane"2. 进入 Kind 控制平面的容器&#xff1a; docker exec -it kind-control-plane…

洛谷入门刷题Day5(想刷水题结果被水题刷了)

P1304 哥德巴赫猜想 题目描述 输入一个偶数 N N N&#xff0c;验证 4 ∼ N 4\sim N 4∼N 所有偶数是否符合哥德巴赫猜想&#xff1a;任一大于 2 2 2 的偶数都可写成两个质数之和。如果一个数不止一种分法&#xff0c;则输出第一个加数相比其他分法最小的方案。例如 10 10…