ES入门六:Suggesters Api实践

news2024/9/22 21:17:39

都是负担在很多app上,当我们输入某些内容时候,它会立即做一些补全操作,
image.png
如果我想实现上述的需求,我们就可以使用ES提供的Suggesters Api。那Suggesters是如何做到的那?简单来说,Suggesters会将输入的文本拆分为token(token就是根据规则切分文本后一个个词),然后在索引里面查找相似的Term,根据使用场景不同,ES提供了以下4种Suggester:

  1. Term Suggester:基于单纯的纠错补全
  2. Phrase Suggester:基于短语的纠错补全
  3. Completion Suggester:自动补全单词,输入词语的前半部分,自动补全单词
  4. Context Suggester:基于上下文的补全提示,可以实现上下文感知推荐

Term Suggester

Term Suggester 提供了**基于单词的纠错、补全功能,其工作原理是基于编辑距离(edit distance)来运作的,编辑距离的核心思想就是一个词需要改变多少个字符就可以和另外一个词一致。所以如何一个词转换为原词所需要改动的字符数越少,它越有可能是最佳匹配。比如,**linux和linux,为了吧linux转变为linux需要改变一个字符“v”,所以其编辑距离为1

Term Suggester工作的时候,会将输入的文本切分成一个个单词(我们称之为token),然后根据每个单词提供建议,所以其不会考虑输入文本间各个单词的关系。
先来一个示例:

image.png
如上图所示:用户搜索了“kernel architture”,其中“architture”是错误的拼写。Suggester Api需要在“suggest”块中指定参数:

  • “my_suggest”: 这个是我们自定义的名称
  • “text”:指定了需要产生建议的文本,一般是用户的输入内容
  • “term”: 表示使用的是Term Suggester Api,如果是Phrase Suggeseter用的是’phrase’
  • “suggest_mode”: 设置建议的模式
    • missing:如果索引中存在就不进行建议,默认
    • popular: 推荐出现频率更高的词
    • always:不管是否存在,都进行建议
  • “field”: 指定从哪个文档上获取建议,上例中,是从书名(name)中获取建议
  • “analyzer”: 指定分词器来对输入文本进行分词,默认与fileld指定的字段设置的分词器一样
  • “size”: 为每个单词提供的最大建议数
  • “sort”: 建议结果排序的方式,有以下两个选项
    • score:先按相似性得分排序,然后按文档频率排序,最后按词项本身(字母顺序的等)排序。
    • frequencry: 先按文档频率排序,然后按相似性得分排序,最后按词项本身排序

返回结果:
image.png

从返回结果可以看出,对于每个词语的建议结果,放在了 “options”数组中。如果一个词语有多个建议,那么就按照sort参数指定的方式进行排序。实例中,由于“kernel”这个词是存在的,并且 suggest_mode为“missing”,所以不进行建议,其options为空

Phrase Suggester

Term Suggester产生的建议是基于每个单词的,如果想要对整个短语或者一句话建议,Term Suggester就有点无能为力了,所以我们就会使用Phrase Suggester Api来获取与用户输入相似的内容

Phrase Suggester在Term Suggester的基础上增加了一些额外的逻辑,因为是短语形式的建议,所以会考量多个Term间的关系,比如相邻的程度、词频等。
下面是一个示例:
image.png
返回结果:
image.png
这个就比较简单,定义了使用Phrase使用的建议字段为name,返回结果里面options 返回了一个短语列表,并且因为“history”和“time”在一个文档里出现过,其可信度相对于其他来说更高,所以得分更高。因为我们使用“highlight”选项,所以返回结果中被替换的词语会高亮显示

Phrase Suggester还有其他一些参数:

  • max_error:指定最多可以拼写错误的词语的个数
  • confidence:其作用用来控制返回结果条数的,如果用户输入的数据的得分为N,那么返回结果的得分需要大于N * confidence。confidence默认值为1.0
  • highlight:高亮后被修改后的词语

Completion Suggester

Completion Suggester提供了自动补全的功能,其应用场景是用户每输入一个字符就需要返回匹配的结果给用户。在并发量大、用户输入速度快的时候,对服务的吞吐量来说是个不小的挑战。所以Completion Suggester不能像上面的Suggester Api那样简单通过倒排索引实现,比如使用其他高效的数据结构和算法才能满足要求

Completion Suggester在实现的时候会将analyze(将文本分词,并且去除没用的词语,例如is、at这种词语)后的数据结构,构建为FST并且和索引存放在一起。FST(finite-state transducer)是一种高效的前缀查询索引,由于FST天生为前缀查询而生,所以其非常适合实现自动补全的功能。ES会将整个FST加载到内存中,所以在使用FST进行前缀查询的时候效率是非常高效的。

在使用Completion Suggester前需要定义Mapping,对应的字段需要使用“completion” type。下面我们来构建一个新的books_completion索引,其Mapping和测试数据如下:

PUT books_completion
{
  "mappings": {
    "properties": {
        "book_id": {
          "type": "keyword"
        },
        "name": {
          "type": "text",
          "analyzer": "standard"
        },
        "name_completion": {
          "type": "completion"
        },
        "author": {
          "type": "keyword"
        },
        "intro": {
          "type": "text"
        },
        "price": {
          "type": "double"
        },
        "date": {
          "type": "date"
        }
      }
  },
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

PUT books_completion/_doc/1
{
  "book_id": "4ee82462",
  "name": "Dive into the Linux kernel architecture",
  "name_completion": "Dive into the Linux kernel architecture",
  "author": "Wolfgang Mauerer",
  "intro": "The content is comprehensive and in-depth, appreciate the infinite scenery of the Linux kernel.",
  "price": 19.9,
  "date": "2010-06-01"
}

PUT books_completion/_doc/2
{
  "book_id": "4ee82463",
  "name": "A Brief History Of Time",
  "name_completion": "A Brief History Of Time",
  "author": "Stephen Hawking",
  "intro": "A fascinating story that explores the secrets at the heart of time and space.",
  "price": 9.9,
  "date": "1988-01-01"
}

PUT books_completion/_doc/3
{
  "book_id": "4ee82464",
  "name": "Beginning Linux Programming 4th Edition",
  "name_completion": "Beginning Linux Programming 4th Edition",
  "author": "Neil Matthew、Richard Stones",
  "intro": "Describes the Linux system and other UNIX-style operating system on the program development",
  "price": 12.9,
  "date": "2010-06-01"
}

来个示例:
image.png
返回结果:
image.png

如上示例,在“my_suggest”中,“prefix”指定了需要匹配的前缀数据,“completion”中的“fileld”指定了需要匹配文档的哪个字段,返回结果中的“options”包含了整个文档的数据

需要注意的是,Completion Suggester在索引数据的时候经过了analyze阶段,所以使用不同的analyzer会造成构建FST的数据不同,例如某些词(is、at等)被去除、某些词被转换等。

Context Suggester

Context Suggster是Completion Suggeseter的扩展,可以实现上下文感知推荐。列入当我们在编程类型的数据中查询“liun”的时候,可以返回linux编程相关的书籍,但在任务自传类型的书籍中,将会返回linus的自传。要实现这个功能,可以在文档中加入分类信息,帮助我们做精准推荐

ES支持两种类型的上下文:

  • Category:任意字符串的分类
  • Geo:地理位置信息

下面我们看看如何基于任意字符串的分类来做上下文推荐。同样,在使用Context Suggester前,首先要创建mapping,然后在数据中加入相关的 Context 信息。下面是使用 Context Suggester 时的 Mapping:

#删除原来的索引
DELETE books_context

# 创建用于测试 Context Suggester 的索引
PUT books_context
{
  "mappings": {
    "properties": {
        "book_id": {
          "type": "keyword"
        },
        "name": {
          "type": "text",
          "analyzer": "standard"
        },
        "name_completion": {
          "type": "completion",
          "contexts": [
            {
              "name": "book_type",
              "type": "category"
            }  
          ]
        },
        "author": {
          "type": "keyword"
        },
        "intro": {
          "type": "text"
        },
        "price": {
          "type": "double"
        },
        "date": {
          "type": "date"
        }
      }
  },
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

# 导入测试数据
PUT books_context/_doc/4
{
  "book_id": "4ee82465",
  "name": "Linux Programming",
  "name_completion": {
    "input": ["Linux Programming"],
    "contexts": {
      "book_type": "program"
    }
  },
  "author": "Richard Stones",
  "intro": "Happy to Linux Programming",
  "price": 10.9,
  "date": "2022-06-01"
}

PUT books_context/_doc/5
{
  "book_id": "4ee82466",
  "name": "Linus Autobiography",
  "name_completion": {
    "input": ["Linus Autobiography"],
    "contexts": {
      "book_type": "autobiography"
    }
  },
  "author": "Linus",
  "intro": "Linus Autobiography",
  "price": 14.9,
  "date": "2012-06-01"
}

如上所示的Mapping中,其中“name_completion”的类型还是为“completion”,在“context”中有2个字段,其中“type”为上下文的类型,就是上面说的Category和Geo,本例子中使用了Category。而“name”则为上下文的名称, 本例子为“book_type”

导入的数据中,“name_completion”中的“input”字段用于内容匹配。“book_type”的值有多个,“program”是编程类的,“autobiography”是自传类的

我们拿一个案例试一下;
image.png

返回的结果数据:
image.png

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

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

相关文章

每日一练:LeeCode-707. 设计链表 【链表+虚拟头结点+设计】

每日一练:LeeCode-707. 设计链表 【链表虚拟头结点设计】 思路设置虚拟头节点 本文是力扣 每日一练:LeeCode-707. 设计链表 【链表虚拟头结点设计】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode-70…

Rabbitmq消息丢失-消费者消息丢失(二)

说明:消费端在处理消息的过程中出现异常,例如:业务逻辑异常,或者消费者被停机,或者网络断开连接等,以上等情况使消息没有得到正确恰当的处理,也会使消息丢失。 分析:分析就是说明中…

中科数安|防止电脑文件资料外泄

#防止电脑文件资料泄漏# 中科数安提供了一系列解决方案来防止电脑文件资料外泄。 www.weaem.com 这些解决方案包括以下几个方面: 访问控制:实施严格的文件访问控制,确保只有授权的人员能够访问和编辑核心文件。使用身份验证和权限管理系统&a…

Android APK包反编译为java文件教程

方法 流程: test.apk -> smali文件 -> dex文件 -> jar文件 ->java 文件 将APK包解压为 smail文件 下载 apktool工具 apktool.jar 将 test.apk 和 apktool.jar放同一目录下,并执行以下命令 java -jar apktool.jar d -f xxx.apk -o xxx(解…

30、类和接口

文章目录 接口概念接口和类之间有何关系? 可以使用接口来约束类接口继承接口接口还可以继承类接口为什么可以继承类内层原因:接口为什么可以继承类 用得出的结论解释最初的demo接口继承类的一些限制 接口概念 接口(Interfaces)可…

SAP PP学习笔记 - 豆知识07 - 如何查看BOM一览

SAP标准提供了CS03,只能查询单个的BOM,如果想查看一览,只能自己写SQVI 查询。 有其他高招的童鞋,请赐教啊。 1,SQVI 工具 SAP MM学习笔记18- SQVI 工具_sap sqvi-CSDN博客 输入查询名,然后点击 登录 2&a…

C++学习笔记:set和map

set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…

Linux高级编程:进程间的通信(二)、IPC

回顾 共7种方式&#xff1a; 古老的进程间通信方式&#xff1a; 管道&#xff1a; 无名管道 有名管道 信号 系统V IPC进程对象 共享内存 消息队列 信号量集 socket通信 //网络 ------------------------- 无名管道 pipe&#xff08;&#xff09; 特点&#xff1a; 用于…

CSS3笔记

1.相同优先级的样式以写在后面的为主。 2.交集选择器&#xff0c;并且 条件挨在一起 p.rich{...} /*p元素class有rich的元素*/ 3.并集选择器&#xff0c;或者 逗号隔开 .class1,class2{...}/*满足其中一个类名都会使用该样式*/ 4.后代选择器 空格 隔开 所有符合的包括孙子及…

揭秘App访问量背后的秘密:数据统计与分析

在移动互联网时代&#xff0c;App已成为人们日常生活的重要组成部分。对于App运营者来说&#xff0c;了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量&#xff0c;为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…

2024年【焊工(初级)】找解析及焊工(初级)考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;找解析是安全生产模拟考试一点通生成的&#xff0c;焊工&#xff08;初级&#xff09;证模拟考试题库是根据焊工&#xff08;初级&#xff09;最新版教材汇编出焊工&#xff08;初级…

【EAI 027】Learning Interactive Real-World Simulators

Paper Card 论文标题&#xff1a;Learning Interactive Real-World Simulators 论文作者&#xff1a;Mengjiao Yang, Yilun Du, Kamyar Ghasemipour, Jonathan Tompson, Leslie Kaelbling, Dale Schuurmans, Pieter Abbeel 作者单位&#xff1a;UC Berkeley, Google DeepMind, …

leetcode 移除链表元素

本题中&#xff0c;我们是要移除链表的某一个节点&#xff0c;为了确保统一操作&#xff0c;我们需要使用虚拟头节点&#xff0c;这样我们删除节点的时候&#xff0c;就是把这个要删除的节点&#xff08;当前节点cur&#xff09;的前一个节点pre&#xff0c;使得pre.next指向要…

jsp阿帕奇安装教程

1.将压缩包解压&#xff0c;存放在自己所知道的位置 2.将软件文件夹打开 使用winr &#xff0c;输入cmd运行打开 输入Java或者Javac&#xff0c;出现一大串之后表明成功 接着在所解压的软件中点开bin这个文件夹&#xff0c;找到startup.bat点击 点击之后会出现黑框&#xff0c…

Linux中断实验:定时器实现按键消抖处理

一. 简介 前面文章学习了Linux驱动按键中断实验,文章地址如下: Linux驱动按键中断实验:按键中断功能的实现-CSDN博客 本文在Linux驱动按键中断实现的基础上,使用定时器实现按键消抖处理。 二. Linux中断实验:定时器实现按键消抖处理 1. 定时器处理按键消抖的原理 按…

java使用poi、ftl将html导出word,设置视图为 页面视图

1、修改html标签&#xff0c; 加入如下内容 <html xmlns:v"urn:schemas-microsoft-com:vml" xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:w"urn:schemas-microsoft-com:office:word" xmlns:m"http://schemas.microsoft.c…

【NCRE Python】

基本输入输出函数 input 函数 input 函数用于从标准输入&#xff08;如键盘&#xff09;接收用户输入的字符串。当 input 函数被调用时&#xff0c;程序会暂停执行&#xff0c;等待用户输入文本并按回车键。用户输入的文本会作为字符串返回给程序。input 函数还可以接收一个字…

【笔记版】docker常用指令---systemctl类、docker状态

systemctl [options] docker 启动&#xff1a;system start docker查看状态&#xff1a;systemctl status docker停止&#xff1a;systemctl stop docker有警告&#xff1a;service关闭了&#xff0c;但是docker.socket仍响应解决方法&#xff1a;systemctl stop docker.socket…

OSError: [WinError 1455] 页面文件太小,无法完成操作。

[问题描述]&#xff1a;OSError: [WinError 1455] 页面文件太小&#xff0c;无法完成操作。 原因1&#xff1a;线程数太大 方法&#xff1a;改小线程&#xff08;workers&#xff09;数。 原因2&#xff1a;虚拟内存太小或为0&#xff0c;调大虚拟内存。 方法&#xff1a;右键…