介绍
Elasticsearch的Completion Suggester是一种专门为快速自动补全功能设计的查询类型。它主要用于提供实时的建议或提示,以帮助用户在搜索框中完成输入。以下是其主要特点:
-
快速响应:Completion Suggester针对快速查找进行了优化,确保即使在大量数据和高并发请求的情况下也能提供实时响应。
-
前缀匹配:它通常用于支持用户输入时的前缀匹配,即当用户开始输入查询时,它会基于已输入的前缀提供可能的补全建议。
-
自定义权重:您可以为索引中的每个建议项分配权重,以影响其在结果中的排名。这意味着更相关或更受欢迎的建议可以被配置为更有可能出现在列表的顶部。
-
文档源字段:当建议被返回时,它们可以包含与建议相关的其他信息,如标题或ID,从而使前端实现更加灵活和信息丰富。
-
上下文过滤:Completion Suggester支持上下文过滤,使得建议能够根据某些条件如用户地理位置、个人喜好等进行动态过滤和调整。
-
FST(Finite State Transducers):Elasticsearch使用FST技术来存储和检索Completion Suggester数据,这有助于在保持高性能的同时减少内存占用。
-
简单的查询语法:它提供了一种简单的查询语法,使得开发者可以轻松地实现和集成自动补全功能。
-
容易集成:与Elasticsearch的其他特性一样,Completion Suggester也易于集成到现有的应用程序中,提供了灵活性和可扩展性。
总的来说,Completion Suggester是Elasticsearch提供的一个强大工具,特别适用于需要快速响应和实时更新的自动补全场景。
实战
索引定义
用来产生建议的字段需要设置成“completion”类型。除了用来产生建议的字段,还可以像普通的索引一样定义其它字段。
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
},
"detail": {
"type": "keyword"
}
}
}
}
上面这个索引包括suggest和detail字段,suggest字段用来生成索引。
增加Suggestion内容
实际上,Suggestion由input和weight构成。下面这些都是正确的做法:
像普通索引一样增加Suggestion,默认权重是1
put {{host}}/{{index_name}}/_doc/1
Content-Type: application/json
{
"suggest" : "后端开发1"
}
显式指定权重
put {{host}}/{{index_name}}/_doc/2
Content-Type: application/json
{
"suggest" : {
"input": "后端开发2",
"weight" : 2
}
}
多个词,默认权重是1
put {{host}}/{{index_name}}/_doc/3
Content-Type: application/json
{
"suggest" : {
"input": [ "后端开发3-1", "后端开发3-2" ]
}
}
多个词,显式指定权重
put {{host}}/{{index_name}}/_doc/4
Content-Type: application/json
{
"suggest" : {
"input": [ "后端开发4-1", "后端开发4-2" ],
"weight" : 3
}
}
多个词,显式指定权重
put {{host}}/{{index_name}}/_doc/5
Content-Type: application/json
{
"suggest" : [{"input": "后端开发5-1", "weight" : 5}, {"input": "后端开发5-2", "weight" : 6}]
}
查询
- 查询由suggest字段指定条件,可以包含多个字查询(像下面的suggest1,suggest2)
- 可以通过_source字段限制返回的字段
- 不支持通过filter或query过滤建议结果
- 可以使用size限制返回的建议数量
- 可以使用skip_duplicates去重
- 返回的结果会根据权重排序
请求示例如下:
get {{host}}/{{index_name}}/_search
Content-Type: application/json
{
"suggest": {
"suggest1": {
"prefix": "后端",
"completion": {
"field": "suggest",
"size": 1,
"skip_duplicates": true
}
},
"suggest2": {
"prefix": "软件",
"completion": {
"field": "suggest",
"size": 1,
"skip_duplicates": true
}
}
},
"_source": {
"excludes": ["sourceType"]
}
}
结果示例如下:
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"suggest": {
"suggest1": [
{
"text": "后端",
"offset": 0,
"length": 2,
"options": [
{
"text": "后端开发4-1",
"_index": "demo-suggester-completion-e1",
"_id": "4",
"_score": 3.0,
"_source": {
"suggest": {
"input": [
"后端开发4-1",
"后端开发4-2"
],
"weight": 3
}
}
}
]
}
],
"suggest2": [
{
"text": "软件",
"offset": 0,
"length": 2,
"options": [
{
"text": "软件开发",
"_index": "demo-suggester-completion-e1",
"_id": "qbvEwowB1R4wwBSB4Rmj",
"_score": 1.0,
"_source": {
"suggest": "软件开发",
"detail": "软件开发详情"
}
}
]
}
]
}
}