Elasticsearch-Suggest API

2023-10-18 13:59
文章标签 elasticsearch api suggest

本文主要是介绍Elasticsearch-Suggest API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

什么是搜索建议

Elasticsearch Suggester API

Term Suggester

Phrase Suggester

The Complete Suggester

使用Completion Suggester的一些步骤

 Context Suggester

实现Context Suggester

精准度和召回率


什么是搜索建议

  • 现代的搜索引擎,一般会提供一个Suggest as you type 功能

  • 帮助用户在输入搜索的工程中,进行自动补全或者纠错.通过协助用户输入更加精确的关键词,提高后续搜索阶段文档匹配的长度

  • 在google上搜索,一开始会自动补全.当输入到一定长度,如果因为单词拼写错误无法补全,就会开始提示相似的词或者句子

Elasticsearch Suggester API

  • 搜索引擎中类似的功能,在ES中是通过Suggester API实现的

  • 原理:将输入的文本分解为Token,然后在索引的字典里查找相似的Term并返回

  • 根据不同的场景,ES设计了四种类别的Suggesters

    • Term & Phrase Suggester

    • Complete & Context Suggester

Term Suggester

  • Suggester就是一种特殊类型的搜索,"text"里是调用时候提供的文本,通常来自于用户界面上用户输入的内容

  • 用户输入的"lucen"是一个错误的拼写

  • 会到指定的字段"body"上搜索,当无法搜索到结果时(missing),返回建议的词

POST /atricles/_bulk
{"index":{}}
{"body":"lucene is very cool"}
{"index":{}}
{"body":"ES builds on top of lucene"}
{"index":{}}
{"body":"ES rocks"}
{"index":{}}
{"body":"es is the company behind ELK stack"}
{"index":{}}
{"body":"ELK stack rocks"}
{"index":{}}
{"body":"es is rock solid"}

POST /atricles/_search
{
  "size":1,
  "query": {
    "match": {
      "body": "lucen rock"
    }
  },
  "suggest": {
    "term-suggestion": {
      "text": "lucen rock",
      "term": {
        "suggest_mode": "missing",
        "field":"body"
      }
    }
  }
}

  • 搜索"lucen rock"

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

  • 几种Suggestion Mode

    • Missing -- 如果索引中已经存在,就不提供建议(上面的rock就已经存在了,不会提供建议)

    • Polular -- 推荐出现频率更高的词

    • Always -- 无论是否存在,都提供建议

 POST /atricles/_search
{
  "size":1,
  "query": {
    "match": {
      "body": "lucen rock"
    }
  },
  "suggest": {
    "term-suggestion": {
      "text": "lucen rock",
      "term": {
        "suggest_mode": "popular",
        "field":"body"
      }
    }
  }
}

 POST /atricles/_search
{
  "size":1,
  "query": {
    "match": {
      "body": "lucen rock"
    }
  },
  "suggest": {
    "term-suggestion": {
      "text": "lucen hock",
      "term": {
        "suggest_mode": "always",
        "field":"body"
      }
    }
  }
}

POST /atricles/_search
{
  "size":1,
  "query": {
    "match": {
      "body": "lucen rock"
    }
  },
  "suggest": {
    "term-suggestion": {
      "text": "lucen hock",
      "term": {
        "suggest_mode": "always",
        "prefix_length":0,
        "field":"body"
      }
    }
  }

 

Phrase Suggester

  • Phrase Suggester在Term Suggester上增加了一些额外的逻辑

  • 一些参数

    • Suggest Mode : missing,popular,always

    • Max Errors : 最多可以拼错的Terms数

    • Confidence : 限制返回结果数,默认为1

  • 自定义高亮

"highlight":{
          "pre_tag":"<b id='d1' class='t1' style='color:red;font-size:18px;'>",
          "post_tag":"</b>"
        }

参考文档

  • Elasticsearch - phrase suggester - 听雨危楼 - 博客园 (cnblogs.com)

  • (31条消息) 09.phrase_suggester_寒夜-CSDN博客

The Complete Suggester

  • Completion Suggester提供了"自动完成"(Auto Complete)的功能,用户每输入一个字符,就需要及时发送一个查询请求到后台查找匹配项

  • 对性能要求比较苛刻,ElasticSearch采用了不同的数据结构,并非通过倒排索引来完成.而是将Analyze的数据编码成FST和索引放在一起存放.FST会被ES整个加载进内存,速度很快

  • FST只能用于前缀查找

使用Completion Suggester的一些步骤

  • 定义Mapping,使用"completion"type(针对某个字段)

  • 索引数据

  • 运行"suggest"查询,得到搜索建议

    • 在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。_source 字段不会被美化,它的样子与我们输入的一致。

 Context Suggester

  • Completion Suggester的扩展

  • 可以在搜索中加入更多的上下文信息,例如"star"

    • 咖啡相关 : 建议"Starbucks"

    • 电影相关 : "star wars"

实现Context Suggester

  • 可以定义两种类型的Context

    • Category --任意的字符串

    • GEO -- 地理位置信息

  • 实现Context Suggester的具体步骤
    • 定制一个 Mapping

  • 索引数据,并且为每个文档加入Context信息 如果 comment属于movies的上下文的时候就给他推荐"star wars";如果 comment属于coffee的上下文的时候就给他推荐"starbucks"

  • 结合Context进行Suggestion

精准度和召回率

  • 精确度

    • Completion > Phrase > Term

  • 召回率

    • Term > Phrase > Completion

  • 性能

    • Completion > Phrase > Term

这篇关于Elasticsearch-Suggest API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233014

相关文章

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee