在信息爆炸的时代,用户对搜索效率的要求越来越高。联想补全功能作为提升搜索体验的关键技术,能够在用户输入过程中实时提供可能的搜索建议,极大地减少了用户的输入成本。Elasticsearch(简称 ES)作为一款强大的分布式搜索引擎,内置了专门的联想补全机制。

一、核心概念与相关组件 

ES 的联想补全功能主要围绕completion类型字段和Completion Suggester展开。

  • completion类型字段是专门为联想补全场景设计的,它采用了一种特殊的倒排索引结构 ——有限状态传感器(FST)。FST 能够高效地存储和检索前缀,非常适合处理前缀匹配的联想补全需求,并且占用的存储空间相对较小。

  • Completion Suggester则是用于查询completion类型字段的工具,它可以根据用户输入的前缀,快速返回匹配的建议结果。

二、实现步骤 

1. 创建索引并定义映射

首先需要创建一个索引,并在映射中定义completion类型的字段。例如,创建一个名为products的索引,用于存储商品信息,其中suggest字段为completion类型,用于提供商品名称的联想补全。

PUT /products

{

    "mappings": {

    "properties": {

    "name": {

        "type": "text"

    },

    "suggest": {

        "type": "completion"

          }

    }

    }

}

2. 插入数据

向索引中插入包含completion类型字段的数据。在插入数据时,suggest字段需要传入一个数组,数组中的元素即为可能的联想建议项。

POST /products/_doc/1

{

    "name": "iPhone 15",

    "suggest": ["iPhone 15", "苹果手机 15", "iPhone 15 Pro"]

}

POST /products/_doc/2

{

    "name": "华为Mate 60",

    "suggest": ["华为Mate 60", "Mate 60", "华为手机 Mate 60"]

}

3. 使用 Completion Suggester 进行查询

当用户输入部分内容时,通过Completion Suggester查询completion类型字段,获取联想建议。例如,用户输入 “iPh”,查询代码如下:

POST /products/_search

{

    "suggest": {

    "product_suggest": {

            "prefix": "iPh",

            "completion": {
    
            "field": "suggest"

                }

           }

      }

}

查询结果会返回以 “iPh” 为前缀的建议项,如 “iPhone 15”“iPhone 15 Pro” 等。

高级用法

1. 权重设置

可以为不同的建议项设置权重(weight),权重高的建议项会优先显示。在插入数据时,将建议项以对象形式传入,指定input(建议文本)和weight(权重值)。

POST /products/_doc/3

{

    "name": "小米14",

    "suggest": [

        {"input": "小米14", "weight": 3},

        {"input": "小米手机 14", "weight": 2}

      ]

}

在查询时,权重高的 “小米 14” 会比权重低的 “小米手机 14” 更可能出现在前面。

2. 模糊匹配

默认情况下,Completion Suggester是精确匹配前缀的。如果需要支持模糊匹配,可以设置fuzzy参数。例如,允许用户输入存在一个字符错误的情况:

POST /products/_search

{

    "suggest": {

          "product_suggest": {

          "prefix": "iphon",

          "completion": {

                "field": "suggest",

                "fuzzy": {

                "fuzziness": 1

                }

            }

        }

       }

}

上述查询可以匹配到 “iPhone 15” 等建议项,即使输入的 “iphon” 少了一个 “e”。

3. 上下文感知补全

通过context参数,可以实现基于上下文的联想补全。例如,区分不同类别的商品建议。首先在定义映射时指定上下文:

PUT /products

{

    "mappings": {

    "properties": {

        "suggest": {

            "type": "completion",

            "contexts": [

                {

                "name": "category",

                "type": "category"

                }

            ]

        }
    
    }

}

}

插入数据时指定上下文信息:

POST /products/_doc/4

{

      "name": " MacBook Pro",

        "suggest": {

        "input": ["MacBook Pro", "苹果笔记本 Pro"],

        "contexts": {

            "category": "电脑"

        }

    }

}

查询时传入上下文参数,只获取 “电脑” 类别的建议:

POST /products/_search

{

     "suggest": {

    "product_suggest": {

        "prefix": "Mac",

        "completion": {

        "field": "suggest",

        "contexts": {

            "category": "电脑"

        }

        }

       }

    }

}

注意事项

  • completion类型字段的数据一旦写入,修改起来相对麻烦,因为 FST 索引不支持动态更新。如果需要频繁更新建议项,可能需要重新索引数据。

  • 建议项的长度不宜过长,否则会增加 FST 的存储空间和查询时间,影响性能。

  • 在高并发场景下,需要合理配置 ES 集群的资源,以保证联想补全功能的响应速度。

三、使用场景

ES 的联想补全功能广泛应用于各种搜索场景,如电商网站的商品搜索、搜索引擎的关键词提示、新闻网站的标题联想等。它能够显著提升用户的搜索体验,提高搜索的准确性和效率。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐