es基于completion suggest实现搜索提示

在之前的某一篇中,我们使用了es的前缀搜索,获得了文档根据前缀进行匹配的效果,如下图所示,
es基于completion suggest实现搜索提示_第1张图片

下面说说在es中的另一种实现搜索提示的功能,基于completion suggest 进行实现,其在实际应用中搜索性能更加高效,

假如文档库里有一堆关于大话西游的,比如,“大话西游电影”,“大话西游小说”,"大话西游舞台剧"等,这里我们需要搜索以"大话西游"开头的文档,

1、自定义index,及字段分词属性,这里用IK中文分词器,

PUT /news_website
{
  "mappings": {
    "news" : {
      "properties" : {
        "title" : {
          "type": "text",
          "analyzer": "ik_max_word",
          "fields": {
            "suggest" : {
              "type" : "completion",
              "analyzer": "ik_max_word"
            }
          }
        },
        "content": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}

2、completion,es实现的时候,是非常高性能的,会构建不是倒排索引,也不是正拍索引,
就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以auto completion进行的前缀搜索提示,性能是非常高的,向索引插入几条数据

PUT /news_website/news/1
{
  "title": "大话西游电影",
  "content": "大话西游的电影时隔20年即将在2017年4月重映"
}
PUT /news_website/news/2
{
  "title": "大话西游小说",
  "content": "某知名网络小说作家已经完成了大话西游同名小说的出版"
}
PUT /news_website/news/3
{
  "title": "大话西游手游",
  "content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"
}
PUT /news_website/news/4
{
  "title": "我想看大话西游手游",
  "content": "星爷的大话西游2怎么还没有出来,等不及了"
}

es基于completion suggest实现搜索提示_第2张图片

3、查询,

GET /news_website/news/_search
{
  "suggest": {
    "my-suggest" : {
      "prefix" : "大话西游",
      "completion" : {
        "field" : "title.suggest"
      }
    }
  }
}

这里查出来了3条数据,即以"大话西游"为前缀的文档,而原本的第4条数据没有查出来,
es基于completion suggest实现搜索提示_第3张图片

本篇到此就结束了,希望对看到的小伙伴有用,最后感谢观看!

你可能感兴趣的:(ElasticSearch)