编程语言
498
什么是自动补全
随用户输入,给与提示信息,如下图:
ES实现原理
⽤户每输⼊⼀个 字符,就需要即时发送⼀个查询请求到后段查找匹配项。
对性能要求⽐较苛刻。Elasticsearch 采⽤FST,FST 会被 ES 整个加载进内存, 速度很快。
实现方式:
Completion Suggester 实现****
1.定义 Mapping,使⽤ “completion” type
2.索引数据
3.运⾏ “suggest” 查询,得到搜索建议。
例子
1****.****定义 Mapping,使⽤ “completion” type
DELETE inputcompletion # 设置mapping PUT inputcompletion { "mappings": { "_doc": { "properties": { "input_completion": { "type": "completion" } } } } }
2.索引数据
POST inputcompletion/_doc/_bulk { "index" : { } } { "input_completion": "elasticsearch 教程"} { "index" : { } } { "input_completion": "elasticsearch api 中文"} { "index" : { } } { "input_completion": "elasticsearch"}
3.运⾏ “suggest” 查询,得到搜索建议。
POST inputcompletion/_doc/_search?pretty { "size": 0, "suggest": { "input-suggester": { "prefix": "ela", "completion": { "field": "input_completion" } } } }
结果
{ "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 0, "max_score": 0, "hits": [] }, "suggest": { "input-suggester": [ { "text": "ela", "offset": 0, "length": 3, "options": [ { "text": "elasticsearch", "_index": "inputcompletion", "_type": "_doc", "_id": "ezqix3cBMB6-gr9-ORLt", "_score": 1, "_source": { "input_completion": "elasticsearch" } }, { "text": "elasticsearch api 中文", "_index": "inputcompletion", "_type": "_doc", "_id": "ejqix3cBMB6-gr9-ORLt", "_score": 1, "_source": { "input_completion": "elasticsearch api 中文" } }, { "text": "elasticsearch 教程", "_index": "inputcompletion", "_type": "_doc", "_id": "eTqix3cBMB6-gr9-ORLt", "_score": 1, "_source": { "input_completion": "elasticsearch 教程" } } ] } ] } }
Context Suggester带上下文的推荐****
例如:再手机品类下搜索,小米提示小米手机,再食品下,提示真空小米
定义两种类型的 Context
Category – 任意的字符串
Geo – 地理位置信息
实现 Context Suggester 的具体步骤
1.定制⼀个 Mapping 索引数据
2.并且为每个⽂档加⼊ Context 信息
3.结合 Context 进⾏ Suggestion 查询
例子
1. 定制⼀个 Mapping 索引数据
DELETE inputcompletion PUT inputcompletion { "mappings": { "_doc": { "properties": { "input_completion": { "type": "completion", "contexts":[{ "type":"category", "name":"goods_category" }] } } } } }
2.并且为每个⽂档加⼊ Context 信息
POST inputcompletion/_doc { "comment":"小米手机", "input_completion":{ "input":["小米"], "contexts":{ "goods_category":"手机" } } } POST inputcompletion/_doc { "comment":"真空小米", "input_completion":{ "input":["小米"], "contexts":{ "goods_category":"食品" } } }
3. 结合 Context 进⾏ Suggestion 查询
POST inputcompletion/_search { "suggest": { "MY_SUGGESTION": { "prefix": "小米", "completion":{ "field":"input_completion", "contexts":{ "goods_category":"食品" } } } } }
结果
{ "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 0, "max_score": 0, "hits": [] }, "suggest": { "MY_SUGGESTION": [ { "text": "小米", "offset": 0, "length": 2, "options": [ { "text": "小米", "_index": "inputcompletion", "_type": "_doc", "_id": "bjqgx3cBMB6-gr9-vBL2", "_score": 1, "_source": { "comment": "真空小米", "input_completion": { "input": [ "小米" ], "contexts": { "goods_category": "食品" } } }, "contexts": { "goods_category": [ "食品" ] } } ] } ] } }
参考
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-suggesters-completion.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/suggester-context.html