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