文章目录

  • 一、前言
  • 二、search_as_you_type 的原理
    • 2.2 shingle 过滤器
  • 三、自定义排序(如热点加权,广告加权等)

一、前言

  在7.0+版本中es官方贴心的为我们提供了一个新的字段类型search_as_you_type 来帮我实现开箱即用的搜索建议功能,官方文档中提到它的工作原理是创建一系列子字段,这些子字段被分析为索引词,可以通过部分匹配整个索引文本值的查询进行有效匹配。在早之前官方也为我们提供了,suggests_completion、suggests_phrase、suggest_term等实现自动补全纠错等功能。但是suggest只能提供前缀搜索建议并且存储在内存中构建成本很高(磁盘成本远远低于内存成本这也是选择search_as_you_type的一个原因),可以仔细观察市面上如淘宝,京东,微博等电商都是只支持前缀索引。B站是个例外支持了中缀索引,因为我们的业务特点中缀索引比重更大所以放弃了suggester下面就不多赘述。感兴趣的朋友可以翻阅官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-suggesters.html#completion-suggester

二、search_as_you_type 的原理


  需要注意的是es7以后的版本min_gram和max_gram的粒度默认是不大于1,也就是说分词是一个字符一个字符逐个分的。如果粒度需要大于1需要设置一下index.max_ngram_diff大于等于它们的差值,否则会报错。

  要想我们的搜索建议强大且高效其内在原理我们需要吃透,下面先直观的感受下search_as_you_type帮我们创建的子字段的效果。其实官方文档的效果已经很直观了https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-edgengram-tokenfilter.html

  ngram我个人理解为gram(克)为最小一个单位的意思,应用到es中对应这一个字符,即排列组合按最小单位分割默认一到两个字符就会看到下面的切分结果,ngram3也很好理解了只是多出一些如qui uic ick的三字符切分



  很好理解edge中文翻译过来就是边缘的意思,意味着edge_ngram只能从最左侧边缘位置开始分割


2.2 shingle 过滤器

  一个 shingle 过滤器在 token 级别执行此操作,而不是像ngrams 在字符级别。,因此如果你有文本 “foo bar baz” 并再次使用 in_shingle_size 为2且 max_shingle_size 为3,则你将生成以下 token:

foo, foo bar, foo bar baz, bar, bar baz, baz

  为什么仍然包含单 token 输出? 这是因为默认情况下,shingle 过滤器包含原始 token,因此原始标记生成令牌 foo,bar 和 baz,然后将其传递给 shingle token 过滤器,生成标记foo bar,foo bar baz 和 bar baz。 所有这些 token 组合在一起形成最终 token 流。 你可以通过将 output_unigrams 选项设置为 false 来禁用此行为,也即不需要最原始的 token:foo, bar 及 baz

  下一个清单显示了 shingle token 过滤器的示例; 请注意,min_shingle_size 选项必须大于或等于2。

PUT my_index
PUT my_index
{"settings": {"analysis": {"analyzer": {"shingle": {"type": "custom","tokenizer": "ik_max_word","filter": ["shingle-filter"]}},"filter": {"shingle-filter": {"type": "shingle","min_shingle_size": 2,"max_shingle_size": 3,"output_unigrams": false}}}}
}

在这里,我们定义了一个叫做 shingle-filter 的过滤器。最小的 shangle 大小是2,最大的 shingle 大小是3。同时我们设置 output_unigrams 为 false,这样最初的那些 token 将不被包含在最终的结果之中。

下面我们来做一个例子,看看显示的结果:

POST search_suggest_complete/_search
{"query" : {"match": {"sayt":{"query": "比克"}}}
}

下图是开发测试时候为了对比构建的index所以有很多没有意义字段自信忽略

三、自定义排序(如热点加权,广告加权等)

比我我们有特殊要求,要让给了广告费的产品或者是近期新产品排在前面该如何实现(需求,让守护地球的战士排在前面)。我们通过使用function_score加权,这里为了演示新增一个字段。如果检测到type字段为1就代表当前产品给了广告费我们需要将它向前推

GET /search_suggest_complete/_search
{"query": {"function_score": {"query": {"multi_match": {"query": "bike","type": "bool_prefix","fuzziness": 2,"operator": "and","fields": ["sayt","sayt._2gram","sayt._3gram","sayt._index_prefix"]}},"functions": [{"filter": {"term": {"type": 1}},"weight": 2}],"boost": 1,"score_mode": "sum"}
}
}

可以看到此时守护地球比克分数直接翻了一倍到达了搜索建议的最上方,类似需求都换汤不换药都可以采用function_score实现。一个简单的搜索建议大概就是这些,如需拼音搜索建议记得指定分析器中加入pingyin其它的慢慢探索吧。

elasticsearch7.x+---搜索建议设计与实现相关推荐

  1. 机器学习在高德搜索建议中的应用优化实践

    来自:高德技术 导读:高德的愿景是:连接真实世界,让出行更美好.为了实现愿景,我们要处理好LBS大数据和用户之间的智能链接.信息检索是其中的关键技术,而搜索建议又是检索服务不可或缺的组成部分. 本文将 ...

  2. 网络营销外包——网站搜索框设计不同人群网络营销外包有不同设计

    众所周知,网站中的搜索框设计对用户及时搜索到网站内的信息十分重要,可以帮助用户迅速找到自己想要的信息内容,以满足用户访问网站的需求.一般来说,网站搜索框的设计可以在一定程度上节省用户浏览的时间,提升用 ...

  3. 基于Elasticsearch实现搜索建议

    搜索建议是搜索的一个重要组成部分,一个搜索建议的实现通常需要考虑建议词的来源.匹配.排序.聚合.关联的文档数和拼写纠错等,本文介绍一个基于Elasticsearch实现的搜索建议. 问题描述 电商网站 ...

  4. 【百度地图API】如何使用suggestion--下拉列表方式的搜索建议

    摘要: 百度地图上有一个很强大的搜索建议功能,以下拉列表的方式展示出来.比如,输入"百度",下拉列表中就会出现"北京市海淀区百度在线网络技术(北京)有限公司". ...

  5. 有关AutoCompleteBox组件的研究[5][Final]_集成搜索引擎搜索建议(Search Suggestion)——Silverlight学习笔记[40]...

    在AutoCompleteBox组件中集成搜索引擎的功能是十分常见的,这有助于我们更好地与Web进行交互.本文将为大家讲述如何在在AutoCompleteBox组件中集成搜索引擎的搜索建议. 实例: ...

  6. 苹果推出App Store搜索建议功能

    4月30日消息,据国外媒体报道,苹果正式在App Store上推出了搜索建议功能,将使搜索应用变得更加容易. 据悉,现在在输入搜索关键词之后,App Store将尝试预测你在寻找什么,并提供建议词,当 ...

  7. 建议设计日常多逛,多学习的网站

    需求太紧,没有时间寻找设计素材? 身处在信息时代的我们经常被各种庞大信息. 作为设计师建议设计日常多逛,多学习的网站. 临摹作品练习的好处? 首先锻炼你的借鉴能力,当你的技法娴熟到一定程度,就可以尝试 ...

  8. UI设计中搜索页设计指南

    在开始之前,我们先来想一个问题,用户为什么要使用搜索功能呢? 今天我带大家一起来探讨一下UI搜索页面的一些设计方法. 用户搜索的目的是为了快速找到自己想要的结果!搜索页是用户进行搜索的第一站,最理想的 ...

  9. solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现

    今天思考实现了下字符加汉字的搜索建议的 实现--思想主要还是昨天的思想,不过这个方法使用的是匹配查询 ,查询速度可能不太理想 /*** * @描述:用于完成拼音加汉字 组合情况的搜索建议 ---尽量少 ...

最新文章

  1. 为所欲为——教你什么才是真正的任意分频
  2. python数组和列表_Python-01矩阵、数组和列表等的总结
  3. Scrapy中的yield使用
  4. 处理硬件设备访问权限问题
  5. 吃的苦中苦,方为人上人!
  6. dockerfile实例
  7. Ubuntu系统下go语言环境的搭建
  8. 表生成器@ TableGenerator
  9. 第三章项目管理过程重点--转载
  10. 机房短信通(SMS Alert System)
  11. 华普天健会计师事务所管理合伙人朱宗瑞:期待数据资产价值在财务报表里充分体现...
  12. 电视不正常Android镜像投屏,爱奇艺乐播投屏
  13. SQL语言-更新操作命令
  14. linux 进程调度 运行队列 自旋锁,linux内核进程调度(自旋锁)
  15. HTML5的绘图步骤——示例绘制火柴人
  16. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法
  17. Zabbix监控系统详解
  18. 咸达医药数据库--介绍
  19. 使用深度学习进行目标检测
  20. 愿我是清晨洒入你心间的第一缕阳光

热门文章

  1. 第十二章: 项目采购管理
  2. PMCAFF外包大师长期招募兼职团队和个人
  3. x0vncserver
  4. 清明小假去哪玩?不出深圳也好玩的特色农家乐团建有哪些?
  5. 从固定频段和持续电位中分离解码空间注意和工作记忆
  6. JavaCV录制屏幕(窗口)和系统声音,内录
  7. [ Python ] 常用类库学习之 tabulate
  8. SAS PROC TABULATE学习笔记01
  9. 联想拯救者连不上网?
  10. 如何在 ggplot2 中更改背景颜色(附示例)