ES系列、Elasticsearch Suggester API(自动补全)
1.概念
1.1 补全api主要分为四类
- Term Suggester(纠错补全,输入错误的情况下补全正确的单词)
- Phrase Suggester(自动补全短语,输入一个单词补全整个短语)
- Completion Suggester(完成补全单词,输出如前半部分,补全整个单词)
- Context Suggester(上下文补全)
整体效果类似百度搜索,如图:
2. Completion suggester 自动补全
针对自动补全场景而设计的建议器。此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。因此实现上它和前面两个Suggester采用了不同的数据结构,索引并非通过倒排来完成,而是将analyze过的数据编码成FST和索引一起存放。对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。但是FST只能用于前缀查找,这也是Completion Suggester的局限所在。
2.1建立索引
put  /book
{
    "mappings": {
        "music" : {
            "properties" : {
                "suggest" : {
                    "type" : "completion"
                },
                "title" : {
                    "type": "keyword"
                }
            }
        }
    }
}
注意,最终写入数据需要 /book/music 
2.2插入数据
put /book/music/_doc/1
{
    "suggest":"爱一个人好难"
}
put /book/music/_doc/2
{
    "suggest":"爱一个人好难"
}
put /book/music/_doc/3
{
    "suggest":"爱真的需要勇气"
} 
2.3自动补全查询
示例1:查询建议根据前缀查询
POST book/music/_search
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "爱",
            "completion" : {
                "field" : "suggest"
            }
        }
    }
} 
示例1:查询建议根据前缀查询结果
{
    "took": ,
    "timed_out": false,
    "_shards": {
        "total": ,
        "successful": ,
        "skipped": ,
        "failed":
    },
    "hits": {
        "total": ,
        "max_score": ,
        "hits": []
    },
    "suggest": {
        "song-suggest": [
            {
                "text": "te",
                "offset": ,
                "length": ,
                "options": [
                    {
                        "text": "爱一个人好难",
                        "_index": "book",
                        "_type": "music",
                        "_id": "6Xu6mmUBYLvVFwGWpXeL",
                        "_score": ,
                        "_source": {
                            "suggest": "爱一个人好难"
                        }
                    },
                    {
                        "text": "爱一个人好难",
                        "_index": "book",
                        "_type": "music",
                        "_id": "6nu8mmUBYLvVFwGWSndC",
                        "_score": ,
                        "_source": {
                            "suggest": "爱一个人好难"
                        }
                    },
                    {
                        "text": "爱真的需要勇气",
                        "_index": "book",
                        "_type": "music",
                        "_id": "63u8mmUBYLvVFwGWZHdC",
                        "_score": ,
                        "_source": {
                            "suggest": "爱真的需要勇气"
                        }
                    }
                ]
            }
        ]
    }
} 
示例2:对建议查询结果去重
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "爱",
            "completion" : {
                "field" : "suggest" ,
                 "skip_duplicates": true
            }
        }
    }
} 
本文部分参考:《》 里面有整个四种补全的方式。
