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"
        }
      }
    }
  }
}

你可能感兴趣的:(ElasticSearch | Completion Suggester | Context Suggester)