Elasticsearch 7.x 深入【8】Suggester

1. 借鉴

极客时间 阮一鸣老师的Elasticsearch核心技术与实战
Elasticsearch 5.x Suggester详解
店名大全 -_-||
官方文档 search-suggesters
详解编辑距离(Edit Distance)及其代码实现
Edit Distance 算法实现及其设计原理
leetcode edit-distance
elasticsearch suggest实现搜索词自动补全
Elasticsearch之建议器suggester
Elasticsearch搜索Suggest功能优化
【Elasticsearch】7.2 自动补全、纠错、拼音搜索
elasticsearch使用more_like_this实现基于内容的推荐
Field datatypes(2)
elasticsearch补全功能之只补全筛选后的部分数据context suggester
Elasticsearch学习笔记5: suggest实现搜索补全
Phrase Suggester
lucene底层数据结构——FST,针对field使用列存储,delta encode压缩doc ids数组,LZ4压缩算法
关于Lucene的词典FST深入剖析
FST
Completion Suggester.md

2. 开始

Suggester,顾名思义,即用户输入后,进行自动补全或者纠错,并给出相应的结果。
其原理是将输入分解为token,然后再索引中查找相似的关键词(term)并返回
在es里面有四种Suggester:

  • Term Suggester
  • Phrase Suggester
  • Completion Suggester
  • Context Suggester

我们逐一来看下

数据准备:使用到的数据请看这里

Term Suggester

The term suggester suggests terms based on edit distance. The provided suggest text 
is analyzed before terms are suggested. The suggested terms are provided per 
analyzed suggest text token. The term suggester doesn’t take the query into account 
that is part of request.

term suggester基于编辑距离算法实现。在提供建议之前,对输入的文本进行分析。

我们在索引中有一个“三生石工艺坊批发店”这个店铺,我们基于这个来查询。

  • 我们首先来看下它的分词情况:[这里为啥是ik_smart而不是ik_max_word呢?因为我指定的search_analyzer是ik_smart,在suggest查询是,默认使用search_analyzer分词匹配,当然也可以自己指定,这个在官方文档上有描述,下面我会将它的选项列举出来,稍安勿躁]
GET /store_suggest/_analyze
{
  "analyzer": "ik_smart",
  "text": ["三生石工艺坊批发店"]
}
  • 嗯,我们来看下它的token[为了避免拉的过长,我只保留了token字段]
{
  "tokens" : [
    { "token" : "三生石", },
    { "token" : "工艺", },
    { "token" : "坊", },
    { "token" : "批发店", }
  ]
}
  • 可以看到上面我们分词的结果中有三生石,那接下我故意输错为“三声石”,让我们来构建一个term suggester,看下它会提示我们什么
GET /store_suggest/_search
{
  "suggest": {
    "term-suggestion": {
      "text": "三声石", // 我们输入的内容
      "term": {
        "field": "name", // 指定哪个字段
        "suggest_mode": "missing", // 参数1
        "min_word_length": 2 // 参数2
      }
    }
  }
}
  • 我们来看下结果
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "suggest" : {
    "term-suggestion" : [
      {
        "text" : "三声",
        "offset" : 0,
        "length" : 2,
        "options" : [
          {
            "text" : "三生",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      },
      {
        "text" : "石",
        "offset" : 2,
        "length" : 1,
        "options" : [ ]
      }
    ]
  }
}
  • score是通过“编辑距离算法”实现的,可以看到我借鉴的文章,关于编辑距离的,讲的挺好。
  • 可以看到“三声”提示我们应该为“三生”,我在查询时候使用了几个参数,我们来解释一下
  • 这些参数是四种suggester查询的公共参数
字段名称 解释 默认值
text      输入内容 -
field 作用的字段 -
analyzer 使用的分词器 search analyzer
size 使用的分词器 每个建议文本返回的最大提示数量
sort 如何排序:
score:首先按分数排序,然后按文档频率排序,最后按关键词本身排序。
frequency:首先按文档频率排序,然后是相似度评分,最后是关键词本身。
-
suggest_mode 模式:
missing:如果索引中已经存在,就不提供建议
popular:推荐出现频率更高的词
always:无论是否存在,都提供建议
-
  • 下面这些是Term Suggester独有的参数
字段名称 解释 默认值
max_edits                                               编辑距离:只能是1和2之间的值。任何其他值都会导致抛出错误的请求。 -2             
prefix_length 必须匹配的最小前缀字符的数量。 1
min_word_length 建议的文本术语必须具有的最小长度才能被包括在内。 4
string_distance 要使用哪个字符串距离实现来比较建议的term的相似性
internal:默认值,基于damerau_levenshtein,对于比较索引内的词的字符串距离进行了高度优化
damerau_levenshtein:基于Damerau-Levenshtein算法
levenshtein:基于Levenshtein edit distance算法
jaro_winkler:基于Jaro-Winkler算法
ngram: 基于character n-grams算法
internal
shard_size 设置要从每个分片中检索的建议的最大数量。在reduce阶段,只根据size选项返回前N个建议。默认size选项,将这个值设置为大于size的值,这有助于获得更准确的文档频率,以牺牲性能为代价获得拼写更准确。由于term是在分词时产生的,因此分片级的文档中拼写正确的频率可能并不精确。增加这值将使这些文件频率更精确。 -
max_inspections 一个因子,用于与shards_size相乘,以便检查shard级别上的更多候选拼写更正。以牺牲性能为代价来提高精度。 5
min_doc_freq 建议中出现的文档数量的最小阈值。这可以指定为绝对数量,也可以指定为文档数量的相对百分比。这可以通过只建议高词频的term来提高质量。默认为0f,未启用。如果指定的值大于1,则该数字不能是小数。这个选项使用分片级文档频率。 0f
max_term_freq 建议文本标记可以存在的文档数量的最大阈值,以便将其包括在内。可以是表示文档频率的相对百分比数(例如0.4)或绝对数。如果指定的值大于1,则不能指定分数。这可以用来排除高频术语(通常拼写正确)的拼写检查。这也提高了拼写检查的性能。这个选项使用碎片级文档频率。 0.01

Phrase Suggester

The phrase suggester adds additional logic on top of the term suggester to select entire 
corrected phrases instead of individual tokens weighted based on ngram-language 
models. In practice this suggester will be able to make better decisions about which 
tokens to pick based on co-occurrence and frequencies.

phrase suggester 在 term suggester 之上添加额外的逻辑以选择整个经校正的短语,而不是基于 ngram-language 模型加权的单个 token 。

  • 我们构建一个看下效果
GET /store_suggest/_search
{
  "suggest": {
    "phrase-suggestion": {
      "text": "三生时工艺坊批发店",
      "phrase": {
        "field": "name",
        "max_errors": 4,
        "confidence": 0,
        "direct_generator": [{
          "field": "name",
          "suggest_mode": "missing"
        }],
        "highlight": {
          "pre_tag": "
                                
                                
  • CommonDAO(公共/基础DAO) g21121 DAO
            好久没有更新博客了,最近一段时间工作比较忙,所以请见谅,无论你是爱看呢还是爱看呢还是爱看呢,总之或许对你有些帮助。         DAO(Data Access Object)是一个数据访问(顾名思义就是与数据库打交道)接口,DAO一般在业
  • 直言有讳 永夜-极光 感悟随笔
      1.转载地址:http://blog.csdn.net/jasonblog/article/details/10813313   精华: “直言有讳”是阿里巴巴提倡的一种观念,而我在此之前并没有很深刻的认识。为什么呢?就好比是读书时候做阅读理解,我喜欢我自己的解读,并不喜欢老师给的意思。在这里也是。我自己坚持的原则是互相尊重,我觉得阿里巴巴很多价值观其实是基本的做人
  • 安装CentOS 7 和Win 7后,Win7 引导丢失 随便小屋 centos
    一般安装双系统的顺序是先装Win7,然后在安装CentOS,这样CentOS可以引导WIN 7启动。但安装CentOS7后,却找不到Win7 的引导,稍微修改一点东西即可。 一、首先具有root 的权限。      即进入Terminal后输入命令su,然后输入密码即可 二、利用vim编辑器打开/boot/grub2/grub.cfg文件进行修改 v
  • Oracle备份与恢复案例 aijuans oracle
    Oracle备份与恢复案例 一. 理解什么是数据库恢复当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过程大致可以分为复原(Restore)与
  • JavaEE开源快速开发平台G4Studio v5.0发布 無為子
      我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V5.0版本已经正式发布。   访问G4Studio网站 http://www.g4it.org   2013-04-06 发布G4Studio_V5.0版本 功能新增 (1). 新增了调用Oracle存储过程返回游标,并将游标映射为Java List集合对象的标
  • Oracle显示根据高考分数模拟录取 百合不是茶 PL/SQL编程oracle例子模拟高考录取学习交流
    题目要求: 1,创建student表和result表 2,pl/sql对学生的成绩数据进行处理 3,处理的逻辑是根据每门专业课的最低分线和总分的最低分数线自动的将录取和落选     1,创建student表,和result表 学生信息表; create table student( student_id number primary key,--学生id
  • 优秀的领导与差劲的领导 bijian1013 领导管理团队
    责任 优秀的领导:优秀的领导总是对他所负责的项目担负起责任。如果项目不幸失败了,那么他知道该受责备的人是他自己,并且敢于承认错误。 差劲的领导:差劲的领导觉得这不是他的问题,因此他会想方设法证明是他的团队不行,或是将责任归咎于团队中他不喜欢的那几个成员身上。 努力工作 优秀的领导:团队领导应该是团队成员的榜样。至少,他应该与团队中的其他成员一样努力工作。这仅仅因为他
  • js函数在浏览器下的兼容 Bill_chen jquery浏览器IEDWRext
      做前端开发的工程师,少不了要用FF进行测试,纯js函数在不同浏览器下,名称也可能不同。对于IE6和FF,取得下一结点的函数就不尽相同:   IE6:node.nextSibling,对于FF是不能识别的;   FF:node.nextElementSibling,对于IE是不能识别的; 兼容解决方式:var Div = node.nextSibl
  • 【JVM四】老年代垃圾回收:吞吐量垃圾收集器(Throughput GC) bit1129 垃圾回收
    吞吐量与用户线程暂停时间   衡量垃圾回收算法优劣的指标有两个: 吞吐量越高,则算法越好 暂停时间越短,则算法越好 首先说明吞吐量和暂停时间的含义。   垃圾回收时,JVM会启动几个特定的GC线程来完成垃圾回收的任务,这些GC线程与应用的用户线程产生竞争关系,共同竞争处理器资源以及CPU的执行时间。GC线程不会对用户带来的任何价值,因此,好的GC应该占
  • J2EE监听器和过滤器基础 白糖_ J2EE
    Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。 监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。   ServletContex监听器 ServletContex又叫application
  • 博弈AngularJS讲义(16) - 提供者 boyitech jsAngularJSapiAngularProvider
      Angular框架提供了强大的依赖注入机制,这一切都是有注入器(injector)完成. 注入器会自动实例化服务组件和符合Angular API规则的特殊对象,例如控制器,指令,过滤器动画等。   那注入器怎么知道如何去创建这些特殊的对象呢? Angular提供了5种方式让注入器创建对象,其中最基础的方式就是提供者(provider), 其余四种方式(Value, Fac
  • java-写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。 bylijinnan java
    public class CommonSubSequence { /** * 题目:写一函数f(a,b),它带有两个字符串参数并返回一串字符,该字符串只包含在两个串中都有的并按照在a中的顺序。 * 写一个版本算法复杂度O(N^2)和一个O(N) 。 * * O(N^2):对于a中的每个字符,遍历b中的每个字符,如果相同,则拷贝到新字符串中。 * O(
  • sqlserver 2000 无法验证产品密钥 Chen.H sqlwindowsSQL ServerMicrosoft
    在 Service Pack 4 (SP 4), 是运行 Microsoft Windows Server 2003、 Microsoft Windows Storage Server 2003 或 Microsoft Windows 2000 服务器上您尝试安装 Microsoft SQL Server 2000 通过卷许可协议 (VLA) 媒体。 这样做, 收到以下错误信息CD KEY的 SQ
  • [新概念武器]气象战争 comsci
           气象战争的发动者必须是拥有发射深空航天器能力的国家或者组织....        原因如下:        地球上的气候变化和大气层中的云层涡旋场有密切的关系,而维持一个在大气层某个层次
  • oracle 中 rollup、cube、grouping 使用详解 daizj oraclegroupingrollupcube
    oracle 中 rollup、cube、grouping 使用详解 -- 使用oracle 样例表演示 转自namesliu -- 使用oracle 的样列库,演示 rollup, cube, grouping 的用法与使用场景    --- ROLLUP , 为了理解分组的成员数量,我增加了 分组的计数  COUNT(SAL)   
  • 技术资料汇总分享 Dead_knight 技术资料汇总 分享
    本人汇总的技术资料,分享出来,希望对大家有用。 http://pan.baidu.com/s/1jGr56uE 资料主要包含: Workflow->工作流相关理论、框架(OSWorkflow、JBPM、Activiti、fireflow...) Security->java安全相关资料(SSL、SSO、SpringSecurity、Shiro、JAAS...) Ser
  • 初一下学期难记忆单词背诵第一课 dcj3sjt126com englishword
    could 能够 minute 分钟 Tuesday 星期二 February 二月 eighteenth 第十八 listen 听 careful 小心的,仔细的 short 短的 heavy 重的 empty 空的 certainly 当然 carry 携带;搬运 tape 磁带 basket 蓝子 bottle 瓶 juice 汁,果汁 head 头;头部
  • 截取视图的图片, 然后分享出去 dcj3sjt126com OSObjective-C
    OS 7 has a new method that allows you to draw a view hierarchy into the current graphics context. This can be used to get an UIImage very fast. I implemented a category method on UIView to get the vi
  • MySql重置密码 fanxiaolong MySql重置密码
    方法一:  在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库  然后进入mysql mysql>use mysql;  mysql>更新 user set password=password('新密码') WHERE User='root'; mysq
  • Ehcache(03)——Ehcache中储存缓存的方式 234390216 ehcacheMemoryStoreDiskStore存储驱除策略
    Ehcache中储存缓存的方式   目录 1     堆内存(MemoryStore) 1.1     指定可用内存 1.2     驱除策略 1.3     元素过期 2   &nbs
  • spring mvc中的@propertysource jackyrong spring mvc
      在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了: @PropertySource  在spring 3.1中开始引入 比如有配置文件 config.properties mongodb.url=1.2.3.4 mongodb.db=hello 则代码中   @PropertySource(&
  • 重学单例模式 lanqiu17 单例Singleton模式
    最近在重新学习设计模式,感觉对模式理解更加深刻。觉得有必要记下来。 第一个学的就是单例模式,单例模式估计是最好理解的模式了。它的作用就是防止外部创建实例,保证只有一个实例。 单例模式的常用实现方式有两种,就人们熟知的饱汉式与饥汉式,具体就不多说了。这里说下其他的实现方式 静态内部类方式: package test.pattern.singleton.statics; publ
  • .NET开源核心运行时,且行且珍惜 netcome java.net开源
    背景 2014年11月12日,ASP.NET之父、微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET 扩展为可在 Linux 和 Mac OS 平台上运行。.NET核心运行时将基于MIT开源许可协议发布,其中将包括执行.NET代码所需的一切项目——CLR、JIT编译器、垃圾收集器(GC)和核心
  • 使用oscahe缓存技术减少与数据库的频繁交互 Everyday都不同 Web高并发oscahe缓存
    此前一直不知道缓存的具体实现,只知道是把数据存储在内存中,以便下次直接从内存中读取。对于缓存的使用也没有概念,觉得缓存技术是一个比较”神秘陌生“的领域。但最近要用到缓存技术,发现还是很有必要一探究竟的。   缓存技术使用背景:一般来说,对于web项目,如果我们要什么数据直接jdbc查库好了,但是在遇到高并发的情形下,不可能每一次都是去查数据库,因为这样在高并发的情形下显得不太合理——
  • Spring+Mybatis 手动控制事务 toknowme mybatis
    @Override    public boolean testDelete(String jobCode) throws Exception {       boolean flag = false;  &nbs
  • 菜鸟级的android程序员面试时候需要掌握的知识点 xp9802 android
    熟悉Android开发架构和API调用 掌握APP适应不同型号手机屏幕开发技巧 熟悉Android下的数据存储  熟练Android Debug Bridge Tool 熟练Eclipse/ADT及相关工具  熟悉Android框架原理及Activity生命周期 熟练进行Android UI布局 熟练使用SQLite数据库; 熟悉Android下网络通信机制,S