ES 笔记二十六:Term & Phrase Suggester

什么是搜索建议

  • 现代的搜索引擎,一般都会提供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是两个词
本作品采用《CC 协议》,转载必须注明作者和本文链接

快乐就是解决一个又一个的问题!

CrazyZard
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!