ElasticSearch | Completion Suggester | Context Suggester

The Completion Suggester

  • Completion Suggester 提供了“自动完成(Auto Completion)”的功能,用户每输入一个字符,就需要即时发送一个查询请求到后端查找匹配项;
  • 这种功能对性能的要求比较苛刻,ElasticSearch 采用了不同的数据结构,而不是使用了倒排索引来实现;通过将 Analyze 的数据编码成 FST 和索引一起存放;FST 会被 ES 整个加载进内存,从而达到更高的性能;
  • FST 只能用于前缀查找;

使用 Completion Suggester 的一些步骤

  • 定义 Mapping,将字段的 type 设置成 completion;
  • 索引数据进 ES;
  • 运行 suggest 查询,得到搜索建议;

Completion Suggester | 举个栗子

数据准备
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" : {} }
自动完成 API
  • 可以查出以 elk 开头的文档;
POST articles/_search?pretty
{
  "size": 0,
  "suggest": {
    "article-suggester": {
      "prefix": "elk ",
      "completion": {
        "field": "title_completion"
      }
    }
  }
}

Context Suggester

  • Context Suggester 是 Completion Suggester 的扩展;
  • 可以在搜索中加入更多的上下文信息,例如输入"star"
    • 咖啡相关:建议 "starbucks";
    • 电影相关:建议 "star wars";

实现 Context Suggester

可以定义两种类型的 Context

  • Category - 任意的字符串;
  • Geo - 地理位置信息;
实现 Context Suggester 的具体步骤
  • 定制一个 mapping;
  • 索引数据,并且为每个文档加入 Context 信息;
  • 结合 Context 进行 Suggestion 查询;

Context Suggester | 举个栗子

创建索引 | 设置 mapping
DELETE comments
PUT comments
PUT comments/_mapping
{
  "properties": {
    "comment_autocomplete":{
      "type": "completion",
      "contexts":[{
        "type":"category",
        "name":"comment_category"
      }]
    }
  }
}
写入文档 | 设置自动补全信息 | 设置 context 信息
  • 通过检测到页面所处的频道,比如 movies 或 coffee,同样的输入前缀,比如 sta,推荐不同的词;
POST comments/_doc
{
  "comment":"I love the star war movies",
  "comment_autocomplete":{
    "input":["star wars"],
    "contexts":{
      "comment_category":"movies"
    }
  }
}

POST comments/_doc
{
  "comment":"Where can I find a Starbucks",
  "comment_autocomplete":{
    "input":["starbucks"],
    "contexts":{
      "comment_category":"coffee"
    }
  }
}
调用 suggest API
  • 通过输入前缀 sta 和分类 coffee,得到索引 comments 的 comment_autocomplete 字段的 input 值;
  • 根据输入前缀 sta 和分类 coffee,推荐的值是 starbucks,并且可以推荐出 input 值是 starbucks 的文档;
POST comments/_search
{
  "suggest": {
    "MY_SUGGESTION": {
      "prefix": "sta",
      "completion":{
        "field":"comment_autocomplete",
        "contexts":{
          "comment_category":"coffee"
        }
      }
    }
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Completion Suggester是一种用于关键词前缀匹配的功能,它可以根据用户输入的前缀来提供相关的补全选项。根据引用\[1\]的描述,Completion Suggester在精准程度上比Phrase和Term要好,但在召回率上则相对较低。因此,如果业务需求可以满足,只使用Completion Suggester进行前缀匹配是最理想的选择。然而,使用Completion Suggester并不是一件容易的事情,需要根据数据特性和业务需求,灵活搭配analyzer和mapping参数,并进行反复调试,才能获得理想的补全效果。此外,还可以使用Fuzzy Queries来增加匹配的模糊程度。总之,使用Completion Suggester需要根据具体情况进行调整和优化,以获得最佳的模糊匹配效果。 #### 引用[.reference_title] - *1* *2* [Elasticsearch Suggester详解(自动补全)](https://blog.csdn.net/qq_40374604/article/details/114841800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ElasticSearch suggester](https://blog.csdn.net/zhanglh046/article/details/78536021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值