菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

ES 笔记二十六:Term & Phrase Suggester

原创
05/13 14:22
阅读数 564

什么是搜索建议

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

Elasticsearch Suggester API

  • 搜索引擎中类似的功能,在 ES 中通过 Sugester API 实现的
  • 原理:将输入的文档分解为 Token,然后在索引的字段里查找相似的 Term 并返回
  • 根据不同的使用场景,ES 设计了 4 种类别的 Suggesters
    • Term & Phrase Suggester
    • Complete & Context Suggester

Term Suggester

  • Suggester 就是一种特殊类型的搜索。“text” 里是调用时候提供的文本,通常来自用户界面上用户输入的内容
  • 用户输入的 “lucen” 是一个错误的拼写
  • 会到 指定的字段 “body” 上搜索,当无法搜索到结果时(missing),返回建议的词

    //插入数据
    POST article/_bulk
    {"index":{}}
    {"body":"lucene is very cool"}
    {"index":{}}
    {"body":"Elasticsearch builds on top of lucene"}
    {"index":{}}
    {"body":"Elasticsearch rocks"}
    {"index":{}}
    {"body":"elastic is the company behind ELK stack"}
    {"index":{}}
    {"body":"Elk stack rocks"}
    {"index":{}}
    {"body":"elasticsearch is rock solid"}
    //suggest
    POST article/_search
    {
    "size": 1,
    "query": {

    "match": {
      "body": "lucen rock"
    }
    

    },
    "suggest": {

    "term-suggestion": {
      "text": "lucen rock",
      "term": {
        "suggest_mode": "missing", // popular  always
        "field": "body"
      }
    }
    

    }
    }
    //返回结果
    "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”:

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

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

    POST article/_search
    {
    "suggest": {

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

    }
    }
    //返回
    "suggest" : {

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

    }

Phrase Suggester

  • Phrase Suggesetr 上增加了一些额外的逻辑
  • 一些参数

    • Suggeset Mode : missing,popular ,always
    • Max Errors: 最多可以拼错的 Terms 数
    • Condfidence : 限制返回结果数,默认为 1

    POST /articles/_search
    {
    "suggest": {

    "my-suggestion": {
      "text": "lucne and elasticsear rock hello world ",
      "phrase": {
        "field": "body",
        "max_errors":2,
        "confidence":0,
        "direct_generator":[{
          "field":"body",
          "suggest_mode":"always"
        }],
        "highlight": {
          "pre_tag": "<em>",
          "post_tag": "</em>"
        }
      }
    }
    

    }
    }

一些测试数据

  • 默认使用 standard 分词器
    • 大写转小写
    • rocks 和 rock 是两个词

发表评论

0/200
0 点赞
0 评论
收藏