Elasticsearch核心技术与实战学习笔记 34 | Term&Phrase Suggester

一 序

    本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。

二 什么是搜索建议

  • 现代的搜索引擎,一般都会提供 Suggest as you type 的功能
  • 帮助用户在输入搜索的过程中,进行自动补全或者纠错。通过协助用户输入更加精准的关键词,提高后续搜索阶段文档匹配的程度
  • 在 google 上搜索,一开始会自动补全。当输入到一定长度,如因为单词拼写错误无法补全,就会开始提示相似的词或者句子

2.1 Elasticsearch Suggester API

  1.  搜索引擎中类似的功能,在 ES 中通过 Sugester API 实现的
  2. 原理:将输入的文档分解为 Token,然后在索引的字段里查找相似的 Term 并返回
  3. 根据不同的使用场景,ES 设计了 4 种类别的 Suggesters
  • Term Suggester(纠错补全,输入错误的情况下补全正确的单词)
  • Phrase Suggester(自动补全短语,输入一个单词补全整个短语)
  • Completion Suggester(完成补全单词,输出如前半部分,补全整个单词)
  • Context Suggester(上下文补全)

2.2Term Suggester

   

demo:

数据准备

DELETE articles
PUT articles
{
  "mappings": {
    "properties": {
      "title_completion":{
        "type": "completion"
      }
    }
  }
}

POST articles/_bulk
{ "index" : { } }
{ "title_completion": "lucene is very cool"}
{ "index" : { } }
{ "title_completion": "Elasticsearch builds on top of lucene"}
{ "index" : { } }
{ "title_completion": "Elasticsearch rocks"}
{ "index" : { } }
{ "title_completion": "elastic is the company behind ELK stack"}
{ "index" : { } }
{ "title_completion": "Elk stack rocks"}
{ "index" : {} }

"suggest" : {
    "term-suggestion" : [
      {
        "text" : "lucen",
        "offset" : 0,
        "length" : 5,
        "options" : [
          {
            "text" : "lucene",
            "score" : 0.8,
            "freq" : 2
          }
        ]
      },
      {
        "text" : "rock",
        "offset" : 6,
        "length" : 4,
        "options" : [ ]
      }
    ]
  }

搜索 “lucen rock”:看结果: "lucene",//推荐了,而rock 没有推荐。

搜索 “lucen rock”:

  • 每个建议都包含了一个算分,相似性是通过 Levenshtein Edit Distance 的算法实现的。核心思想就是一个词改动多少字段就可以和另外一个词一致。提供了很多可选参数来控制相似性的模糊程度。

几种 Suggestion Mode

  • Missing - 如索引中已存在,就不提供建议
  • Popular - 推荐出现频率更加高的词
  • Always - 无论是否存在,都提供建议

因为文档里有两条rocks,所以认为popular的结果为rocks. 换成always也是一样的结果。

POST /articles/_search
{

  "suggest": {
    "term-suggestion": {
      "text": "lucen rock",
      "term": {
        "suggest_mode": "always",
        "field": "body"
      }
    }
  }
}

如果换成hocks查询:

返回:‘

  "suggest" : {
    "term-suggestion" : [
      {
        "text" : "lucen",
        "offset" : 0,
        "length" : 5,
        "options" : [
          {
            "text" : "lucene",
            "score" : 0.8,
            "freq" : 2
          }
        ]
      },
      {
        "text" : "hocks",
        "offset" : 6,
        "length" : 5,
        "options" : [ ]
      }
    ]
  }
}

这里有一些相关的参数可以设置, 

  • lowercase_terms:表示在文本分析后,将推荐文本术语转换成小写;
  • max_edits:表示可以被选为建议的edit distance的最大值,只能是1和2之前的数值,默认是2;
  • prefix_length:表示可以被选为建议的最小前缀字符的长度,默认为1,增加这个长度可以提高拼写检查的性能,通常拼写错误不会发生在术语的最前面(prefix_len参数已经丢弃);
  • min_word_length:表示推荐文本的最小产嘀咕,默认为4(min_word_len参数已被丢弃);
  • shard_size:表示从每个独立碎片(分片)获取建议的最大数量,在减少阶段(reduce phase)基于size参数的设置只返回前N个建议,默认就是size提供的值,将shard_size设置为大于size参数,可能对得到性能为代价更准确的文档频率拼写纠正更加有效,因为术语分区中碎片,碎片级别文档频率的拼写纠正可能不准确,增加这将使这些文档频率更精确;
  • max_inspections:表示一个因子,这个参数和shard_size参数相乘以便在碎片级别检查更多的候选者的拼写错误,可以提高以性能为代价的准确性,参数默认为5;
  • min_doc_freq:表示一个建议中应包含文档数目的最小限制,可以指定为一个确切的数或文档数的相对百分比,可以通过推荐高频术语来提高质量,min_doc_freq默认是0(即不开启此功能),如果将这个参数指定为一个大于1的值(不能是小数,只是大于1时不能指定为小数),碎片级别的文档频率用于这个选项;
  • max_term_freq:表示推荐文本可以包含的文档数目的最大限制,可以是一个代表文档频率的确切值,也可以是一个相对百分数(比如0.4),如果指定为一个大于1的数(不可以指定为小数),默认是0.01f,这个参数可以用来排除高频术语的拼写检查,高频术语通常在前几个字符是拼写正确的以提高拼写检查的性能,碎片(分片)性能文档频率用于这个选项;
  • string_distance:表示一个字符串距离用于和推荐内容相比它们之间的相似性,这个参数可能的值有5个:
    • internal:表示默认的基于damerau_levenshtein算法,但在比较字符串距离内的索引已经做过高度优化;
    • damerau_levenshtein:是一种基于Damerau-Levenshtein算法的字符串距离算法;
    • levenshtein:是一种基于Levenshtein edit distance算法的字符串距离算法;
    • jaro_winkler:是一种基于Jaro-Winkler算法的字符串距离算法;
    • ngram:是一种基于字符连词的字符串距离算法;

针对上面hocks的case:可以使用prefix_length调整最小前缀的长度

2.3 Phrase Suggester

修改下:confidence 

将输入的文本分解为Token,然后再索引的字典里查找相似的term 并返回 .

实际应用中应该有优化空间吧。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频资源太大,这里提供百度云链接: 资源包括项目源码和所需的数据: 01-1 _课程导学~1.mp4 01-2 说明和建议~1.mp4 02-1 -术语介绍 .mp4 02-2 Document介绍.mp4 02-3 index介绍 .mp4 02-4 -restapi介绍 .mp4 02-5 -index_api .mp4 02-6 -document_api.mp4 03-01 -书的目录与索引.mp4 03-02 -正排与倒排索引简介.mp4 03-03 -倒排索引详解.mp4 03-04 -分词介绍.mp4 03-05 -analyze_api .mp4 03-06 -自带分词器.mp4 03-07 -中文分词.mp4 03-08 -自定义分词之CharacterFilter .mp4 03-09 自定义分词之Tokenizer .mp4 03-10 -自定义分词之 TokenFilter .mp4 03-11 -自定义分词.mp4 03-12 -分词使用说明 .mp4 03-13 -官方文档说明.mp4 04-01 -mapping简介.avi 04-02 -自定义 mapping .avi 04-03 -mapping演示.avi 04-04 -copy_to参数说明.avi 04-05 -index参数说明.avi 04-06 -index_options参数说明.avi 04-07 -mapping文档说明.avi 04-08 -数据类型.avi 04-09 -dynamic-mapping简介.avi 04-10 -dynamic日期与数字识别.avi 04-11 -dynamic-template简介.avi 04-12 -自定义mapping的建议.avi 04-13 -索引模板.mp4.avi 05-01 -SearchAPI概览.avi 05-02 -URISearch详解与演示.avi 05-03 -QueryDSL简介.avi 05-04 -字段类查询简介及match-query.avi 05-05 -相关性算分.mp4.avi 05-06 -match-phrase-query_音频.mp4.avi 05-07 -query-string-query.avi 05-08 -simple-query-string-query.avi 05-09 -term-terms-query.avi 05-10 -range-query.avi 05-11 -复合查询介绍及ConstantScore.avi 05-12 -bool-query.avi 05-13 -count-and-source-filtering.avi 06-01 -分布式介绍及cerebro.avi 06-02 -构建集群.avi 06-03 -副本与分片.avi 06-04 -两个问题.avi 06-05 -集群状态.avi 06-06 -故障转移.mp4.avi 06-07 -文档分布式存储.avi 06-08 -脑裂问题.avi 06-09 -shard详解.avi 07-1 -Query-Then-Fetch.avi 07-2 -相关性算分.avi 07-3 -sorting-doc-values-fielddata.avi 07-4 -分页与遍历-fromsize.avi 07-5 分页与遍历.avi 07-6 分页与遍历-search_after.avi 07-7 文档说明.mp4.avi 08-1 -聚合分析简介.avi 08-2 -metric聚合分析.avi 08-3 -bucket聚合分析.avi 08-4 -bucket和metric聚合分析.avi 08-5 -pipeline聚合分析.avi 08-6 -作用范围.avi 08-7 -排序.avi 08-8 -原理与精准度问题.avi 08-9 -文档说明.avi 09-1 -数据建模简介.avi 09-2 -ES数据建模配置相关介绍.avi 09-3 -ES数据建模实例.mp4.avi 09-4 -Nested_Object.avi 09-5 -Parent_Child.avi 09-6 -nested_vs_parent_child.avi 09-7 -reindex.avi 09-8 其他建议.avi 10-1 生产环境部署建议.avi 10-2 写性能优化.avi 10-3 读性能优化.avi 10-4 如何设定shard数.avi 10-5 xpack监控功能介绍.avi 11-1 入门及架构简介.avi 11-2 -Life_of_an_Event.avi 11-3 -queue简介.avi 11-4 -线程简介.avi 11-5 配置简介.avi 11-6 多实例运行.avi 11-7 pipeline配置简介.avi 12-01 input插件详解及glob讲解.avi 12-02 -codec插件详解.avi 12-03 filter插件简介及date插件讲解.avi 12-04 filter插件之grok简介(上).avi 12-05 filter插件之grok简介(下).avi 12-06 filter插件之dissect讲解.avi 12-07 filter插件之mutate 讲解.avi 12-08 filter插件之 json讲解.avi 12-09 filter 插件之geoip和ruby 讲解.avi 12-10 output插件简介.avi 12-11 文档说明.avi 123.bat 13-1 -Logstash实战建议.avi 13-2 -实战之apacheLogs(上).avi 13-3 实战之apacheLogs(下).avi 13-4 实战之csv.avi 13-5 监控运维建议.avi 14-1 beats简介.avi 14-2 Filebeat_Demo.avi 14-3 Filebeat 简介及流程介绍.avi 14-4 Filebeat常见架构及ingest_node介绍.avi 14-5 Filebeat_Module简介.avi 15-1 -简介.avi 15-2 -Module简介.avi 15-3 -实战.mp4.avi 16-1 1-简介(1).avi 16-1 1-简介(1).avi.baiduyun.downloading 16-1 1-简介.avi 16-2 2-实战.avi 17-1 1-Heartbeat.avi 17-2 2-Community_beats.avi 18-1 -配置与线上部署建议.avi 18-2 -Index_Pattern_Objects_Settings使用.avi 19-1 -导入数据.avi 19-2 -Discover实战.avi 20-1 -可视化简介.avi 20-2 -Basic_Charts_介绍.avi 20-3 -Basic_Charts_其他说明.avi 20-4 -Data图表介绍.avi 20-5 -Map图表介绍.avi 20-6 -Timelion介绍.avi 20-7 -VisualBuilder介绍.avi 20-8 -other图表介绍.avi 20-9 -Dashboard介绍.avi 21-1 -项目介绍.avi 21-2 项目实战.avi 22-1 介绍和数据导入.avi 22-2 -实战.avi 23-1 项目简介.avi 23-2 实战(上).avi 23-3 实战(下).avi 24-1 课程总结.avi codes.zip project.zip 文件树.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值