当前位置: 首页 > news >正文

基于 Elasticsearch Completion Suggester 实现高效搜索智能提示

1. 引言

在现代搜索引擎中,搜索智能提示已成为提升用户体验的重要功能之一。无论是电商网站、内容管理平台,还是社交媒体应用,智能提示都能帮助用户快速输入关键字、发现相关内容,并减少拼写错误带来的困扰。

1.1 什么是搜索智能提示?

搜索智能提示(Search Suggestion 或 Autocomplete)是指在用户输入关键词的过程中,系统根据用户的部分输入实时提供候选建议。这些提示通常基于用户的历史搜索记录、热门关键词或内容数据库生成,旨在提高搜索效率和准确性。

例如,在电商平台中,当用户输入“iPh”时,系统可能会自动提示“iPhone 14 Pro Max”、“iPhone 配件”等选项,帮助用户快速完成搜索。

1.2 搜索智能提示的应用场景

搜索智能提示在多个领域具有广泛的应用场景,包括但不限于:

  • 电商平台:为用户提供热门商品、品牌或分类建议。
  • 内容管理系统(CMS):帮助用户快速定位文章、标签或文件。
  • 旅游和酒店预订:根据用户输入的目的地或酒店名称提供建议。
  • 社交媒体:支持用户快速找到好友、标签或话题。
  • 企业内部搜索:简化员工查找文档、客户信息的过程。

这些场景的共通点在于,搜索智能提示不仅缩短了用户查找信息的时间,还提升了搜索的精确度和用户满意度。

1.3 Elasticsearch 在搜索智能提示中的角色

作为一款强大的分布式搜索引擎,Elasticsearch 为实现搜索智能提示提供了高效的工具,其中 Completion Suggester 是实现这一功能的核心组件。它支持快速、实时的提示生成,同时可以根据权重和上下文优化提示结果。

与传统数据库相比,Elasticsearch 的 Completion Suggester 具有以下优势:

  • 高性能:基于 FST(有限状态传输)结构进行索引,支持毫秒级响应。
  • 灵活性:支持多字段、权重排序和上下文过滤等高级功能。
  • 扩展性:适合处理大规模数据,轻松应对海量提示数据的需求。

2. Elasticsearch Completion Suggester 概述

在 Elasticsearch 中,Completion Suggester 是一种专为高效生成搜索提示而设计的工具。它基于 Elasticsearch 的倒排索引和特殊的数据结构(FST,Finite State Transducer),能够快速返回与用户输入匹配的候选结果。了解其工作原理和特性是实现搜索智能提示的关键。

2.1 什么是 Completion Suggester?

Completion Suggester 是 Elasticsearch 提供的一种基于前缀匹配的搜索提示工具,可以根据用户的部分输入实时提供相关的建议结果。这种工具通常用于实现自动补全功能,特别适合需要快速响应的应用场景,如电商搜索、实时内容推荐等。

核心功能:

  • 根据输入的前缀快速查找匹配的结果。
  • 支持通过权重(Weight)排序推荐结果。
  • 提供上下文过滤功能,生成更加精准的建议。
2.2 Completion Suggester 的工作原理

Completion Suggester 使用一种称为 FST(有限状态转换器)的数据结构进行索引和搜索。FST 是一种压缩的自动机结构,可以存储大量的字符串并支持高效的前缀查询。

工作流程:

  1. 数据索引:在创建索引时,Elasticsearch 会将指定字段的数据构建为 FST,保存在内存中。
  2. 前缀匹配:当用户输入部分关键词时,FST 会快速找到匹配的候选项。
  3. 结果排序:根据权重或其他规则对匹配结果进行排序,并返回最相关的提示。

由于 FST 是一种内存高效的结构,Completion Suggester 可以在高性能和低资源占用之间取得平衡。

2.3 Completion Suggester 的优点和限制

优点:

  • 快速响应:FST 结构让查询速度达到毫秒级,非常适合实时提示功能。
  • 轻量级索引:相比全文索引,FST 占用的内存和存储空间更少。
  • 灵活排序:通过权重字段,可以根据业务需求对结果进行优先级排序。
  • 支持上下文过滤:可以根据上下文信息生成更加精准的建议。

限制:

  • 不支持复杂查询:Completion Suggester 专注于前缀匹配,不支持全文搜索或复杂的布尔查询。
  • 高内存需求:虽然 FST 是内存高效的,但它仍需要将索引加载到内存中,对于非常大的数据集可能会有一定的内存消耗。
  • 更新代价较高:索引的更新会导致整个 FST 重建,因此不适合频繁变动的数据场景。
  • 不支持分页:只能返回固定数量的建议结果。
2.4 Completion Suggester 的适用场景

Completion Suggester 主要用于以下场景:

  1. 自动补全:用户输入时实时显示关键词或短语的补全结果。
  2. 导航建议:如电商中根据关键词推荐类别、品牌或热门商品。
  3. 快速跳转:如企业内部搜索中快速定位文件、文档或客户信息。
  4. 上下文相关提示:根据用户的具体场景(如语言、地理位置)提供定制化的提示。

3. 环境准备

在实现基于 Elasticsearch 的 Completion Suggester 功能之前,我们需要完成必要的环境搭建和配置。以下是完整的环境准备指南,包括 Elasticsearch 和 Kibana 的安装、配置以及示例数据的准备。

3.1 安装 Elasticsearch 和 Kibana

ElasticsearchKibana 是配套使用的搜索和可视化工具,确保它们版本匹配以避免兼容性问题。

  1. 下载 Elasticsearch 和 Kibana
    从 Elastic 官方网站 下载最新版本的 Elasticsearch 和 Kibana。选择与你操作系统兼容的版本。

  2. 安装 Elasticsearch

    • 解压下载的安装包。
    • 启动 Elasticsearch:
      ./bin/elasticsearch
      
    • 默认情况下,Elasticsearch 运行在 http://localhost:9200
  3. 安装 Kibana

    • 解压 Kibana 安装包。
    • 修改配置文件 kibana.yml,确保连接到运行的 Elasticsearch 实例:
      server.port: 5601
      elasticsearch.hosts: ["http://localhost:9200"]
      
    • 启动 Kibana:
      ./bin/kibana
      
    • Kibana 默认运行在 http://localhost:5601
  4. 验证安装

    • 访问 http://localhost:9200,确保 Elasticsearch 正常运行。
    • 访问 http://localhost:5601,确保 Kibana 可以连接到 Elasticsearch。
3.2 配置 Elasticsearch

为了使用 Completion Suggester,需要在 Elasticsearch 中设置一个索引并配置相应的字段。

  1. 创建一个简单的索引:

    PUT /autocomplete
    {"mappings": {"properties": {"suggest_field": {"type": "completion"}}}
    }
    
    • type: completion 是实现提示功能的关键字段。
  2. 验证索引是否创建成功:

    GET /autocomplete
    

    返回的结果中应包含 suggest_field 字段的定义。

3.3 准备示例数据

为演示 Completion Suggester 的功能,我们需要一些示例数据,例如电商平台的商品名称。

  1. 导入示例数据:

    POST /autocomplete/_doc
    {"suggest_field": {"input": ["iPhone 14 Pro", "iPhone 13 Mini", "iPhone Accessories"],"weight": 10}
    }POST /autocomplete/_doc
    {"suggest_field": {"input": ["Samsung Galaxy S23", "Samsung Accessories"],"weight": 8}
    }POST /autocomplete/_doc
    {"suggest_field": {"input": ["Google Pixel 7", "Pixel Accessories"],"weight": 9}
    }
    
  2. 验证数据导入:

    GET /autocomplete/_search
    
3.4 测试基本功能
  1. 测试 Completion Suggester 查询:

    POST /autocomplete/_search
    {"suggest": {"product-suggest": {"prefix": "iPh","completion": {"field": "suggest_field"}}}
    }
    
  2. 返回的结果应包含输入 “iPh” 匹配的提示,例如:

    {"suggest": {"product-suggest": [{"text": "iPh","options": [{"text": "iPhone 14 Pro","score": 10},{"text": "iPhone 13 Mini","score": 10},{"text": "iPhone Accessories","score": 10}]}]}
    }
    
3.5 常见问题及解决方案
  1. 无法启动 Elasticsearch 或 Kibana

    • 确保 Java 环境已安装并配置(需要 JDK 11 或以上)。
    • 检查端口是否被占用。
  2. 索引创建失败

    • 检查 Elasticsearch 是否正常运行。
    • 确保 mappings 的语法正确。
  3. 查询返回空结果

    • 确保数据已正确导入。
    • 检查 prefix 是否匹配示例数据。

4. 索引设计

在使用 Elasticsearch 的 Completion Suggester 实现搜索智能提示时,设计合理的索引结构是成功的关键。索引的结构和配置决定了提示结果的准确性、性能以及可扩展性。在本部分,我们将介绍如何设计适合 Completion Suggester 的索引,并配置相关参数。

4.1 定义适合 Completion Suggester 的字段类型

Completion Suggester 的实现依赖于 completion 字段类型。以下是 completion 字段类型的关键属性:

  • input:定义需要生成提示的关键词或短语。
  • weight:设置提示项的权重,用于控制提示结果的排序。
  • contexts(可选):定义上下文信息,用于实现上下文相关的提示。

以下是一个适合 Completion Suggester 的字段示例:

{"properties": {"suggest_field": {"type": "completion","analyzer": "simple","preserve_separators": true,"preserve_position_increments": true,"max_input_length": 50}}
}

字段属性说明:

  • analyzer:用于分词处理输入数据。默认使用 simple 分析器。
  • preserve_separators:控制是否保留分隔符,如空格或破折号。
  • preserve_position_increments:是否保留词位置间隔,对搜索提示结果的匹配有影响。
  • max_input_length:限制输入字符串的最大长度(默认 50)。
4.2 Mapping 配置

在索引中配置 completion 字段时,可以使用以下模板:

  1. 创建索引并定义 Mapping:

    PUT /autocomplete
    {"mappings": {"properties": {"suggest_field": {"type": "completion","analyzer": "standard","preserve_separators": true,"max_input_length": 100}}}
    }
    
  2. 添加上下文支持(可选):
    如果需要基于上下文过滤提示,可以扩展字段定义:

    PUT /autocomplete
    {"mappings": {"properties": {"suggest_field": {"type": "completion","contexts": [{ "name": "category", "type": "category" },{ "name": "location", "type": "geo" }]}}}
    }
    
4.3 如何选择适合的分词器

completion 字段支持自定义分词器,选择合适的分词器可以提升提示结果的准确性。以下是常见的分词器选择及其适用场景:

  1. simple 分词器

    • 将文本按非字母字符分隔。
    • 适合处理简单英文输入。
    "analyzer": "simple"
    
  2. standard 分词器(默认):

    • 提供基本的分词功能。
    • 适用于大多数语言的普通文本。
    "analyzer": "standard"
    
  3. ngram 分词器

    • 将输入拆分为 N-gram(字符片段),支持模糊匹配。
    • 适合拼音搜索或多语言环境。
    "analyzer": {"type": "custom","tokenizer": "ngram","filter": ["lowercase"]
    }
    
  4. custom 分词器

    • 自定义分词规则,根据业务需求灵活配置。
    • 示例:
      PUT /autocomplete
      {"settings": {"analysis": {"analyzer": {"custom_analyzer": {"tokenizer": "whitespace","filter": ["lowercase", "asciifolding"]}}}},"mappings": {"properties": {"suggest_field": {"type": "completion","analyzer": "custom_analyzer"}}}
      }
      
4.4 使用权重优化提示结果

权重(weight)是影响提示结果排序的重要参数。权重值越高的项会优先显示在结果中。

  1. 导入数据并设置权重:

    POST /autocomplete/_doc
    {"suggest_field": {"input": ["iPhone 14 Pro"],"weight": 10}
    }POST /autocomplete/_doc
    {"suggest_field": {"input": ["Samsung Galaxy S23"],"weight": 8}
    }
    
  2. 查询时按权重排序:
    提示结果会自动按照权重从高到低排序,无需额外配置。

4.5 索引设计的最佳实践
  1. 为提示字段单独创建索引:避免与全文搜索字段混淆,提高查询性能。
  2. 选择合适的分词器:根据语言和输入特点选择最优分词器。
  3. 合理设置权重:根据业务需求调整提示项的优先级。
  4. 避免输入冗余数据:限制输入字符串的长度,减少不必要的存储和查询负担。
  5. 使用上下文增强功能:根据用户的上下文环境提供个性化提示。

5. 数据导入

完成索引设计后,接下来需要将数据导入到 Elasticsearch 的 completion 字段中。这一步是实现搜索智能提示的基础。数据导入的过程包括数据准备、导入方法,以及常见问题的解决方案。

5.1 数据格式要求

Completion Suggester 的数据导入需要符合特定的格式。关键字段如下:

  • input:提示的关键词或短语,可以是字符串或字符串数组。
  • weight:提示的权重值(整数),用于控制排序。
  • contexts(可选):上下文信息,支持更精确的提示。

示例文档格式:

{"suggest_field": {"input": ["iPhone 14 Pro", "iPhone Accessories"],"weight": 10}
}

字段说明:

  • input:支持多个字符串,表示关键词或短语。
  • weight:权重值,决定候选提示的排序优先级,值越大,优先级越高。
  • contexts:可选字段,定义上下文过滤条件(如地理位置、类别等)。
5.2 使用 Bulk API 导入数据

为了高效地导入大量数据,可以使用 Elasticsearch 的 Bulk API。以下是 Bulk API 的操作步骤。

  1. 准备数据文件:

    • 创建一个包含批量数据的文件(例如 bulk_data.json)。
    • 文件格式示例:
      { "index": { "_index": "autocomplete", "_id": "1" } }
      { "suggest_field": { "input": ["iPhone 14 Pro"], "weight": 10 } }
      { "index": { "_index": "autocomplete", "_id": "2" } }
      { "suggest_field": { "input": ["Samsung Galaxy S23"], "weight": 8 } }
      { "index": { "_index": "autocomplete", "_id": "3" } }
      { "suggest_field": { "input": ["Google Pixel 7"], "weight": 9 } }
      
  2. 导入数据:

    • 使用 curl 或其他 HTTP 客户端运行以下命令:
      curl -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/json" --data-binary @bulk_data.json
      
    • 返回的结果中应显示成功导入的文档数量。
  3. 验证数据导入:

    • 运行以下查询,检查是否成功导入数据:
      GET /autocomplete/_search
      
5.3 使用单条导入 API

如果数据量较小或需要动态添加单条数据,可以使用以下方法:

  1. 导入单条数据:

    POST /autocomplete/_doc
    {"suggest_field": {"input": ["MacBook Pro"],"weight": 15}
    }
    
  2. 验证数据:

    • 使用 _search API 检查索引中是否包含刚导入的文档:
      GET /autocomplete/_search
      
5.4 数据导入的常见问题和解决方法
  1. 数据格式错误

    • 问题:导入数据时返回 400 Bad Request 错误。
    • 解决方法:检查 JSON 格式是否正确,尤其是字段的层级和类型是否符合 Mapping 定义。
  2. 数据未索引

    • 问题:查询时提示为空结果。
    • 解决方法:
      • 检查索引名称是否正确。
      • 确保字段类型为 completion,并且导入数据的 input 字段符合要求。
  3. 内存占用过高

    • 问题:导入大量数据时,Elasticsearch 占用内存过多。
    • 解决方法:
      • 将数据分批导入,单次 Bulk 请求控制在 5MB 以下。
      • 调整 Elasticsearch 的 JVM 堆大小配置。
  4. 权重设置错误

    • 问题:提示结果顺序不正确。
    • 解决方法:
      • 确保 weight 字段为整数类型。
      • 验证所有导入数据的权重值是否符合业务逻辑。
5.5 数据导入的最佳实践
  1. 分批导入:避免一次性导入过多数据导致性能问题。
  2. 验证导入结果:每次导入后,使用 _search API 验证数据是否正确索引。
  3. 标准化数据:确保导入的 input 数据没有重复,并且格式一致。
  4. 动态更新索引:在业务需求发生变化时,通过动态添加或更新文档来保持提示数据的实时性。

6. 实现搜索智能提示

在完成索引配置和数据导入后,我们可以使用 Completion Suggester 提供的查询语法来实现搜索智能提示。以下将逐步讲解如何通过基本查询和高级参数实现功能,涵盖排序、权重设置以及结果过滤的操作。

6.1 基本查询语法

Completion Suggester 的基本查询需要指定:

  • 用户的输入(prefix)。
  • 用于提示的字段(field)。

以下是一个简单的查询示例:

POST /autocomplete/_search
{"suggest": {"product-suggest": {"prefix": "iPh",   # 用户输入的前缀"completion": {"field": "suggest_field"   # 定义提示字段}}}
}

响应示例:

{"suggest": {"product-suggest": [{"text": "iPh","options": [{ "text": "iPhone 14 Pro", "score": 10 },{ "text": "iPhone Accessories", "score": 10 }]}]}
}
6.2 Completion Suggester 查询的参数解释

Completion Suggester 提供了多个参数用于定制提示行为:

  1. prefix:用户输入的前缀,用于匹配提示结果。

    • 示例:"prefix": "Sam" 会匹配 “Samsung Galaxy S23”。
  2. field:定义要使用的 completion 字段。

    • 示例:"field": "suggest_field"
  3. size:返回的提示结果数量。

    • 默认值:5
    • 示例:返回最多 3 个提示项:
      "completion": {"field": "suggest_field","size": 3
      }
      
  4. fuzzy:启用模糊匹配,适用于拼写错误或用户输入不完整的场景。

    • 示例:允许输入最多 2 个字符错误:
      "completion": {"field": "suggest_field","fuzzy": {"fuzziness": 2}
      }
      
6.3 提示的排序和权重设置

提示结果的排序默认依据 weight 字段,权重值越高的项优先显示。

  1. 数据导入时设置权重:

    POST /autocomplete/_doc
    {"suggest_field": {"input": ["Samsung Galaxy S23"],"weight": 20}
    }
    
  2. 查询时自动按照权重排序:

    POST /autocomplete/_search
    {"suggest": {"product-suggest": {"prefix": "Sams","completion": {"field": "suggest_field","size": 3}}}
    }
    

    结果中权重高的选项会优先显示:

    "options": [{ "text": "Samsung Galaxy S23", "score": 20 },{ "text": "Samsung Accessories", "score": 15 }
    ]
    
6.4 过滤结果示例

通过上下文或其他条件过滤提示结果,可以更精准地满足用户需求。

  1. 基于上下文过滤:
    如果索引字段配置了上下文(例如类别或地理位置),可以使用上下文过滤。

    • 索引配置:

      PUT /autocomplete
      {"mappings": {"properties": {"suggest_field": {"type": "completion","contexts": [{ "name": "category", "type": "category" }]}}}
      }
      
    • 数据导入:

      POST /autocomplete/_doc
      {"suggest_field": {"input": ["iPhone 14 Pro"],"weight": 10,"contexts": { "category": "electronics" }}
      }
      
    • 查询时指定上下文:

      POST /autocomplete/_search
      {"suggest": {"product-suggest": {"prefix": "iPh","completion": {"field": "suggest_field","contexts": {"category": "electronics"}}}}
      }
      
  2. 基于权重和前缀过滤:
    如果不需要上下文,可以通过 prefixsize 限制返回结果的范围。

6.5 常见问题及解决方案
  1. 提示结果为空

    • 确保 prefix 参数与索引中数据的输入匹配。
    • 检查数据是否正确导入并包含在 completion 字段中。
  2. 排序不符合预期

    • 确保数据导入时正确设置了 weight 字段。
    • 验证查询结果的 score 是否与预期一致。
  3. 性能问题

    • 为索引配置合理的分片数,避免单节点负载过高。
    • 确保数据量大时,分批导入并限制查询的返回结果数量。

7. 优化搜索提示

在实现基本的搜索智能提示功能后,为了提升用户体验和系统性能,可以通过多种方式对提示功能进行优化,包括处理多语言支持、实时更新数据、优先显示热词等。以下是常见的优化方法和实践。

7.1 多语言支持

在多语言环境下,用户可能会以不同语言输入搜索关键词。为了提高提示的准确性,可以通过以下方式支持多语言。

1. 使用多个索引分语言存储

为不同语言创建独立的索引,每个索引使用相应语言的分析器:

PUT /autocomplete_en
{"mappings": {"properties": {"suggest_field": {"type": "completion","analyzer": "english"}}}
}PUT /autocomplete_cn
{"mappings": {"properties": {"suggest_field": {"type": "completion","analyzer": "ik_smart"  # 中文分词器}}}
}

在查询时,根据用户的语言环境动态选择对应的索引:

GET /autocomplete_en/_search
2. 使用多语言输入

在同一个文档中为不同语言提供独立的 input

POST /autocomplete/_doc
{"suggest_field": {"input": ["iPhone 14 Pro", "苹果手机 14 Pro"],"weight": 10}
}
7.2 增量更新提示数据

为了应对提示数据的实时性需求(如商品上下架或热词更新),可以使用以下方法实现增量更新:

1. 动态添加新数据

直接向现有索引添加新文档:

POST /autocomplete/_doc
{"suggest_field": {"input": ["New Product"],"weight": 15}
}
2. 更新现有文档

通过 _update API 修改已有文档的内容:

POST /autocomplete/_update/1
{"doc": {"suggest_field": {"input": ["Updated Product"],"weight": 20}}
}
3. 删除过时数据

如果某些提示数据不再需要,可以使用 _delete API 删除:

DELETE /autocomplete/_doc/1
7.3 优先显示热词

在特定场景(如电商促销活动或季节性热词)中,优先显示热词可以显著提升用户体验。

1. 设置高权重

为热词设置更高的 weight 值:

POST /autocomplete/_doc
{"suggest_field": {"input": ["Black Friday Deals"],"weight": 100}
}
2. 动态调整权重

通过脚本更新现有文档的权重:

POST /autocomplete/_update_by_query
{"script": {"source": "ctx._source.suggest_field.weight += params.increment","params": {"increment": 10}},"query": {"match": {"suggest_field.input": "Black Friday Deals"}}
}
7.4 性能优化

随着数据量的增加,搜索提示的性能可能成为瓶颈。以下是一些常见的性能优化方法:

1. 合理分片

根据数据规模调整索引的分片数量,确保查询压力合理分布。

2. 限制返回结果

通过设置 size 限制提示结果的数量,减少不必要的数据传输:

"completion": {"field": "suggest_field","size": 5
}
3. 使用缓存

启用 Elasticsearch 的查询缓存,减少重复查询的资源消耗。

7.5 热词的优先显示
1. 使用时间维度动态管理权重

为热词设置一个定时脚本,定期调整权重:

POST /_tasks/_update_by_query
{"query": {"match": {"suggest_field.input": "hot_keyword"}},"script": {"source": "ctx._source.suggest_field.weight += 100;"}
}
2. 使用上下文优先筛选

如果热词属于特定的上下文(如分类或地区),可以通过上下文优先过滤:

"contexts": {"category": "hot"
}
7.6 提示结果去重和清理
1. 数据导入时去重

在导入提示数据时确保没有重复的 input

2. 定期清理过期数据

使用 _delete_by_query 清理不再需要的提示数据:

POST /autocomplete/_delete_by_query
{"query": {"range": {"timestamp": {"lt": "now-30d"}}}
}
7.7 最佳实践
  1. 动态调整数据:定期更新提示数据,确保内容新鲜且相关。
  2. 实时分析用户行为:根据用户的搜索习惯和点击率动态调整权重。
  3. 多层次提示:提供热词、上下文相关词以及个性化推荐,提升用户体验。
  4. 监控性能:使用 Elasticsearch 的监控工具识别查询瓶颈,优化资源配置。

8. 进阶功能

在实现基本搜索提示功能的基础上,进一步优化用户体验需要引入一些进阶功能,例如上下文相关提示、拼写纠错、模糊匹配等。这些功能可以显著提升搜索的精准度和灵活性。

8.1 使用 Context Suggester 实现上下文相关提示

Context Suggester 是 Elasticsearch 提供的功能,可以根据上下文信息生成更加精准的提示结果。例如,在不同的地理位置、语言或类别下提供特定的提示。

1. 配置上下文

为索引中的 completion 字段添加上下文:

PUT /autocomplete
{"mappings": {"properties": {"suggest_field": {"type": "completion","contexts": [{ "name": "category", "type": "category" },{ "name": "location", "type": "geo" }]}}}
}
2. 导入数据

为提示项添加上下文信息:

POST /autocomplete/_doc
{"suggest_field": {"input": ["iPhone 14 Pro"],"weight": 10,"contexts": {"category": "electronics","location": { "lat": 37.7749, "lon": -122.4194 }}}
}
3. 查询上下文相关提示

在查询时指定上下文信息:

POST /autocomplete/_search
{"suggest": {"product-suggest": {"prefix": "iPh","completion": {"field": "suggest_field","contexts": {"category": "electronics","location": { "lat": 37.7749, "lon": -122.4194 }}}}}
}

使用场景:

  • 根据用户的地理位置提供本地化建议。
  • 按照用户访问的页面类别动态生成提示。
8.2 拼写纠错与模糊匹配

在用户输入错误或输入不完整时,支持拼写纠错和模糊匹配功能可以显著提高用户体验。

1. 启用模糊匹配

在 Completion Suggester 查询中,添加 fuzzy 参数:

POST /autocomplete/_search
{"suggest": {"product-suggest": {"prefix": "iphnoe",  # 输入错误"completion": {"field": "suggest_field","fuzzy": {"fuzziness": 2  # 允许最多 2 个字符错误}}}}
}

响应示例:

"options": [{ "text": "iPhone 14 Pro", "score": 10 },{ "text": "iPhone Accessories", "score": 9 }
]
2. 拼写纠错的最佳实践
  • 在索引中添加常见拼写错误的同义词。
  • 配置 N-gram 分词器以支持部分匹配:
    PUT /autocomplete
    {"settings": {"analysis": {"analyzer": {"ngram_analyzer": {"type": "custom","tokenizer": "ngram","filter": ["lowercase"]}}},"mappings": {"properties": {"suggest_field": {"type": "completion","analyzer": "ngram_analyzer"}}}}
    }
    
8.3 使用模板或 DSL 简化复杂查询

对于需要实现复杂搜索逻辑的场景,可以使用 Elasticsearch 的模板或 Domain-Specific Language(DSL)。

1. 创建查询模板

使用 Elasticsearch 的 stored_script 保存常用的查询逻辑:

POST /_scripts/suggest_query
{"script": {"lang": "mustache","source": {"suggest": {"product-suggest": {"prefix": "{{query}}","completion": {"field": "suggest_field","contexts": {"category": "{{category}}"}}}}}}
}
2. 使用模板查询

调用保存的模板进行查询:

POST /_scripts/suggest_query/_execute
{"params": {"query": "iPh","category": "electronics"}
}
8.4 个性化提示

根据用户的历史搜索行为、偏好或账户信息,提供个性化提示。

1. 动态调整权重

根据用户的偏好动态修改提示项的权重:

POST /autocomplete/_update_by_query
{"script": {"source": "if (params.user_preferences.contains(ctx._source.suggest_field.input)) { ctx._source.suggest_field.weight += 10; }","params": {"user_preferences": ["iPhone 14 Pro"]}}
}
2. 按用户标签过滤

为用户分配特定的标签(如常购品类),在查询时基于标签过滤:

"contexts": {"user_tag": "frequent_buyer"
}
8.5 实现联想式提示

联想式提示可以基于用户的输入动态生成更广泛的相关建议。

1. 配置分词器

使用 edge_ngram 分词器实现部分前缀匹配:

PUT /autocomplete
{"settings": {"analysis": {"tokenizer": {"edge_ngram_tokenizer": {"type": "edge_ngram","min_gram": 1,"max_gram": 10,"token_chars": ["letter", "digit"]}},"analyzer": {"edge_ngram_analyzer": {"tokenizer": "edge_ngram_tokenizer","filter": ["lowercase"]}}},"mappings": {"properties": {"suggest_field": {"type": "text","analyzer": "edge_ngram_analyzer","search_analyzer": "standard"}}}}
}
2. 查询示例

用户输入时返回联想的相关提示:

POST /autocomplete/_search
{"query": {"match": {"suggest_field": {"query": "iph","analyzer": "edge_ngram_analyzer"}}}
}
8.6 整合其他数据源

通过 Elasticsearch 的 ingest pipeline 或外部系统整合多种数据源(如用户搜索日志、热门关键词)生成更全面的提示。

1. 使用 Pipeline 预处理数据

创建 Ingest Pipeline 来处理导入的数据:

PUT /_ingest/pipeline/suggest_pipeline
{"processors": [{"lowercase": {"field": "suggest_field.input"}},{"set": {"field": "suggest_field.weight","value": 5}}]
}
2. 使用 Pipeline 导入数据
POST /autocomplete/_doc?pipeline=suggest_pipeline
{"suggest_field": {"input": ["New Trending Product"]}
}

9. 实战案例

在这一部分,我们将通过一个完整的实战案例,展示如何利用 Elasticsearch 的 Completion Suggester 实现搜索智能提示功能。案例中,我们以电商平台为例,实现一个支持多语言、上下文过滤和权重排序的搜索提示系统。

9.1 项目需求
  1. 场景描述

    • 用户在电商平台的搜索框输入关键词时,需要实时显示与输入匹配的商品、品牌或类别。
    • 提示需要根据用户的语言、访问页面类别(如手机、家电)以及热度排序。
    • 支持模糊匹配和拼写纠错。
  2. 核心功能

    • 搜索提示(实时自动补全)。
    • 多语言支持。
    • 基于上下文(语言、类别)的提示优化。
    • 热词的动态调整。
9.2 环境配置
1. 创建索引

为电商平台的搜索提示创建索引,并配置上下文和多语言支持:

PUT /ecommerce_suggest
{"mappings": {"properties": {"suggest_field": {"type": "completion","contexts": [{ "name": "language", "type": "category" },{ "name": "category", "type": "category" }]}}}
}
2. 准备分词器(可选)

如果支持拼写纠错和模糊匹配,使用 ngram 分词器:

PUT /ecommerce_suggest
{"settings": {"analysis": {"tokenizer": {"ngram_tokenizer": {"type": "ngram","min_gram": 1,"max_gram": 10}},"analyzer": {"ngram_analyzer": {"tokenizer": "ngram_tokenizer","filter": ["lowercase"]}}},"mappings": {"properties": {"suggest_field": {"type": "text","analyzer": "ngram_analyzer","search_analyzer": "standard"}}}}
}
9.3 数据导入
1. 插入基础数据

根据不同语言和类别导入商品名称和分类信息:

POST /ecommerce_suggest/_doc
{"suggest_field": {"input": ["iPhone 14 Pro", "苹果手机 14 Pro"],"weight": 10,"contexts": {"language": "en","category": "electronics"}}
}POST /ecommerce_suggest/_doc
{"suggest_field": {"input": ["Samsung Galaxy S23", "三星 Galaxy S23"],"weight": 8,"contexts": {"language": "zh","category": "electronics"}}
}POST /ecommerce_suggest/_doc
{"suggest_field": {"input": ["Sony Bravia 4K TV", "索尼 Bravia 4K 电视"],"weight": 12,"contexts": {"language": "en","category": "home_appliances"}}
}
2. 更新热词权重

根据业务需求动态调整权重,例如促销活动期间提升特定商品的优先级:

POST /ecommerce_suggest/_update_by_query
{"script": {"source": "ctx._source.suggest_field.weight += 5"},"query": {"match": {"suggest_field.input": "iPhone 14 Pro"}}
}
9.4 查询实现
1. 基本查询

用户输入关键词时,实时返回提示结果:

POST /ecommerce_suggest/_search
{"suggest": {"product-suggest": {"prefix": "iPh","completion": {"field": "suggest_field","size": 5}}}
}
2. 多语言支持

通过上下文过滤,返回对应语言的提示结果:

POST /ecommerce_suggest/_search
{"suggest": {"product-suggest": {"prefix": "三星","completion": {"field": "suggest_field","contexts": {"language": "zh"}}}}
}
3. 基于类别的提示

根据访问页面的类别(如用户在家电页面),过滤结果:

POST /ecommerce_suggest/_search
{"suggest": {"product-suggest": {"prefix": "Sony","completion": {"field": "suggest_field","contexts": {"category": "home_appliances"}}}}
}
4. 模糊匹配

支持用户输入的拼写错误或不完整输入:

POST /ecommerce_suggest/_search
{"suggest": {"product-suggest": {"prefix": "iphnoe",  # 用户输入错误"completion": {"field": "suggest_field","fuzzy": {"fuzziness": 2}}}}
}
9.5 测试结果

以下是针对不同场景的测试结果示例:

  1. 输入关键词 iPh

    {"text": "iPh","options": [{ "text": "iPhone 14 Pro", "score": 15 }]
    }
    
  2. 中文环境输入 三星

    {"text": "三星","options": [{ "text": "三星 Galaxy S23", "score": 8 }]
    }
    
  3. 模糊匹配输入 iphnoe

    {"text": "iphnoe","options": [{ "text": "iPhone 14 Pro", "score": 10 }]
    }
    

10. 常见问题与故障排查

在实际使用 Elasticsearch 的 Completion Suggester 实现搜索智能提示时,可能会遇到一些常见问题。以下列出这些问题及其解决方案,帮助你快速排查故障并优化系统。

10.1 提示结果为空
问题描述

用户输入后没有返回任何提示结果,或者返回的结果不符合预期。

可能原因
  1. 索引中没有数据

    • 数据未正确导入到 completion 字段中。
    • 数据导入时没有设置 inputweight
  2. 查询参数错误

    • 查询中的 prefix 未匹配到任何数据。
    • 上下文过滤条件不匹配。
解决方案
  • 验证索引中是否存在数据:

    GET /autocomplete/_search
    

    确保返回的文档中包含 suggest_field

  • 检查查询是否正确:

    • 使用宽泛的 prefix 进行测试,例如 prefix: ""
  • 如果使用上下文过滤,检查上下文是否与数据一致。

10.2 提示结果顺序不正确
问题描述

返回的提示结果未按照期望的顺序显示。

可能原因
  1. 权重(weight)设置不合理。
  2. 查询结果未按照权重排序。
解决方案
  • 确保数据导入时正确设置了权重:
    POST /autocomplete/_doc
    {"suggest_field": {"input": ["iPhone 14 Pro"],"weight": 20}
    }
    
  • 如果动态调整权重,验证更新是否成功:
    POST /autocomplete/_update_by_query
    {"script": {"source": "ctx._source.suggest_field.weight += 10"},"query": {"match": {"suggest_field.input": "iPhone 14 Pro"}}
    }
    
10.3 性能问题
问题描述

提示查询的响应速度较慢,尤其是在索引数据量较大时。

可能原因
  1. 索引配置不合理:

    • 分片过多或过少。
    • 分词器复杂度高。
  2. 查询参数过于宽泛:

    • 未设置 size 限制返回结果数量。
解决方案
  • 优化分片配置

    • 为小规模数据集减少分片数,避免查询开销过高。
    • 对大规模数据集适当增加分片。
  • 限制返回结果数量

    "completion": {"field": "suggest_field","size": 5
    }
    
  • 启用查询缓存:减少重复查询的资源消耗。

10.4 拼写纠错无效
问题描述

用户输入错误的关键词时,提示结果为空。

可能原因
  1. 查询未启用 fuzzy 参数。
  2. fuzziness 的配置不符合输入错误的模式。
解决方案
  • 启用模糊匹配并设置适当的容错级别:

    "completion": {"field": "suggest_field","fuzzy": {"fuzziness": 2  # 允许最多 2 个字符错误}
    }
    
  • 检查分词器是否支持拼写纠错:

    • 如果数据包含拼音或多语言内容,建议使用 ngram 分词器。
10.5 数据无法更新或删除
问题描述

已导入的提示数据未能及时更新,或者旧数据未能成功删除。

可能原因
  1. 数据更新时索引类型不支持部分更新。
  2. 数据删除时使用了错误的文档 ID。
解决方案
  • 确保使用正确的文档 ID 进行删除:
    DELETE /autocomplete/_doc/<document_id>
    
  • 如果需要更新文档,使用 _update API:
    POST /autocomplete/_update/<document_id>
    {"doc": {"suggest_field": {"input": ["Updated Input"],"weight": 15}}
    }
    
10.6 上下文过滤无效
问题描述

查询中设置的上下文条件未能正确过滤提示结果。

可能原因
  1. 索引中未配置上下文字段。
  2. 数据导入时未包含上下文信息。
  3. 查询时上下文参数与数据不匹配。
解决方案
  • 确保索引中正确配置了上下文字段:
    PUT /autocomplete
    {"mappings": {"properties": {"suggest_field": {"type": "completion","contexts": [{ "name": "category", "type": "category" }]}}}
    }
    
  • 导入数据时添加上下文信息:
    POST /autocomplete/_doc
    {"suggest_field": {"input": ["iPhone 14 Pro"],"contexts": {"category": "electronics"}}
    }
    
  • 查询时指定上下文:
    "completion": {"field": "suggest_field","contexts": {"category": "electronics"}
    }
    
10.7 其他问题及建议
  1. 问题:分词器不支持某些语言

    • 解决方案:安装对应的分析插件,例如 IK 分词器处理中文,Stempel 分词器处理波兰语。
  2. 问题:返回结果包含重复数据

    • 解决方案:在导入数据前去重,或者使用 Elasticsearch 的 distinct 功能对查询结果去重。

11. 总结

通过本篇博客,我们全面讲解了如何利用 Elasticsearch 的 Completion Suggester 实现一个功能完善的搜索智能提示系统。从基础概念到进阶优化,涵盖了完整的技术实现和实际应用场景。以下是对各部分内容的总结和关键点回顾。

11.1 Elasticsearch Completion Suggester 的特点
  • 高效性:利用 FST 数据结构支持毫秒级响应,适合实时搜索提示。
  • 灵活性:支持多语言、上下文过滤和模糊匹配等高级功能。
  • 扩展性:适合大规模数据场景,支持动态权重调整和增量更新。

通过这些特性,Completion Suggester 成为电商、内容管理系统(CMS)、社交平台等搜索场景中的重要工具。

11.2 构建智能提示的核心步骤
  1. 索引设计

    • 为提示功能设计合理的索引 Mapping。
    • 配置 completion 字段和必要的上下文字段(如类别、地理位置等)。
    • 根据需要选择合适的分词器(如 ngramstandard)。
  2. 数据导入与更新

    • 通过 Bulk API 批量导入数据,支持多语言和上下文信息。
    • 动态调整权重,确保热词优先显示。
    • 定期清理或更新索引数据,保持提示内容的实时性。
  3. 实现智能提示查询

    • 基于 prefix 提供实时的关键词建议。
    • 使用上下文过滤和模糊匹配提升提示的精准度。
    • 在复杂场景中利用脚本或 DSL 简化查询逻辑。
  4. 进阶优化

    • 实现拼写纠错和模糊匹配,容错用户输入。
    • 基于用户行为数据动态调整提示权重。
    • 整合多数据源,扩展提示范围。
11.3 常见问题和最佳实践

在实现过程中,可能会遇到索引设计不当、性能瓶颈或结果不符合预期的问题。以下是一些最佳实践:

  • 性能优化:通过限制返回结果数量、启用查询缓存、合理分片配置等提升查询效率。
  • 数据质量管理:确保提示数据没有冗余,并定期清理无用数据。
  • 扩展功能:结合上下文过滤和个性化推荐,满足多样化业务需求。
11.4 搜索智能提示的应用场景
  • 电商平台:自动补全商品名称、品牌、分类等信息,提升购物体验。
  • 内容管理系统(CMS):快速定位文章、标签或文件,优化工作效率。
  • 社交平台:帮助用户搜索好友、话题或标签。
  • 旅游和酒店预订:根据输入的目的地或酒店名称实时提供建议。
11.5 未来扩展方向

随着搜索技术的发展,智能提示功能可以进一步扩展:

  1. 深度学习模型结合

    • 使用 BERT 等模型优化搜索提示的语义理解。
    • 实现上下文更精准的推荐。
  2. 实时行为分析

    • 根据用户点击、搜索记录动态调整提示内容。
    • 结合大数据技术分析用户行为趋势。
  3. 多模态搜索

    • 支持基于图片或语音的智能提示。
    • 在文本提示之外扩展交互方式。

12. 附录

为了帮助读者更好地理解和实现基于 Elasticsearch Completion Suggester 的搜索智能提示功能,本部分提供了相关的资源、完整代码示例和参考文献。

12.1 相关链接与文档
  1. Elasticsearch 官方文档

    • Completion Suggester
    • Mapping Types
    • Bulk API
  2. 社区资源

    • Elastic Discuss Forum
    • Elasticsearch GitHub 仓库
  3. 相关工具

    • Kibana 可视化工具
    • IK 中文分词插件
12.2 完整代码示例

以下是实现搜索智能提示功能的完整代码示例,包括索引创建、数据导入和查询操作。

1. 创建索引
PUT /autocomplete
{"mappings": {"properties": {"suggest_field": {"type": "completion","contexts": [{ "name": "category", "type": "category" },{ "name": "language", "type": "category" }]}}}
}
2. 导入示例数据
POST /autocomplete/_doc
{"suggest_field": {"input": ["iPhone 14 Pro", "苹果手机 14 Pro"],"weight": 15,"contexts": {"category": "electronics","language": "en"}}
}POST /autocomplete/_doc
{"suggest_field": {"input": ["Samsung Galaxy S23", "三星 Galaxy S23"],"weight": 10,"contexts": {"category": "electronics","language": "zh"}}
}
3. 基本查询
POST /autocomplete/_search
{"suggest": {"product-suggest": {"prefix": "iPh","completion": {"field": "suggest_field","size": 5}}}
}
4. 上下文过滤查询
POST /autocomplete/_search
{"suggest": {"product-suggest": {"prefix": "三星","completion": {"field": "suggest_field","contexts": {"category": "electronics","language": "zh"}}}}
}
5. 模糊匹配
POST /autocomplete/_search
{"suggest": {"product-suggest": {"prefix": "iphnoe","completion": {"field": "suggest_field","fuzzy": {"fuzziness": 2}}}}
}
12.3 参考资源
  1. 文章与教程

    • 《深入理解 Elasticsearch 搜索功能》 - 电子工业出版社
    • 官方博客系列:Elastic Blog
  2. 开源项目

    • Elasticsearch Completion Suggest Example
    • Search Autocomplete Demo

12.4 技术问题解答与社区支持

如果你在实践过程中遇到技术问题,可以通过以下方式寻求帮助:

  • Elastic Discuss Forum:与社区成员交流经验和解决方案。
  • GitHub Issues:报告可能的 Elasticsearch Bug 并跟踪开发进展。
  • Stack Overflow:查找或提问关于 Elasticsearch 的问题。

相关文章:

基于 Elasticsearch Completion Suggester 实现高效搜索智能提示

1. 引言 在现代搜索引擎中&#xff0c;搜索智能提示已成为提升用户体验的重要功能之一。无论是电商网站、内容管理平台&#xff0c;还是社交媒体应用&#xff0c;智能提示都能帮助用户快速输入关键字、发现相关内容&#xff0c;并减少拼写错误带来的困扰。 1.1 什么是搜索智能…...

框架建设实战1——创建frame-parent

结合框架的结构&#xff0c;首先我们创建所以使用框架的parent&#xff0c;用以自顶向下的框架组件管理。 本框架基于maven进行依赖管理。具体步骤如下&#xff1a; 1.创建一个module 创建一个maven工程。命名为frame-parent。只有一个pom文件。文件内容主要包含&#xff1a;…...

Qt 安装Qt Serial Port

最近要用Qt写个串口上位机软件&#xff0c;发现Qt的串口库用不了&#xff0c;上网找了一下资料&#xff0c;找到一种解决办法&#xff0c;具体操作如下&#xff1a; 参考文章&#xff1a;https 目录 一、找到QT安装路径&#xff0c;并运行Qt Maintenance Tool二、选择 添加或移…...

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

Vue Web开发(一)

1. 环境配置 1.1. 开发工具下载 1.1.1. HbuilderX 官网地址&#xff1a;https://uniapp.dcloud.net.cn/ 1.1.2. Visual Studio Code 官网地址&#xff1a;https://code.visualstudio.com/Download 1.1.3. Node环境 官网地址&#xff1a;https://nodejs.cn/   正常软件安装…...

帮我写一篇关于AI搜索网页上编写的文章是否存在版权问题的文章, 字数在 3000 字左右。文心一言提问, 记录后用.

AI搜索网页上编写的文章是否存在版权问题&#xff1f; 在当今科技飞速发展的时代&#xff0c;AI搜索工具如雨后春笋般涌现&#xff0c;为人们获取信息提供了极大的便利。然而&#xff0c;随之而来的问题是&#xff0c;AI搜索案例中常常出现很多内容缺乏依据&#xff0c;这引发…...

物联网智能项目如何实现设备高效互联与数据处理?

一、硬件&#xff08;Hardware&#xff09; 设备互联的基础&#xff0c;涵盖传感器、执行器、网关和边缘计算设备。 传感器与执行器 功能&#xff1a; 采集环境数据&#xff08;如温度、湿度、运动等&#xff09;并执行控制命令。优化方向&#xff1a; 低功耗、高精度传感器以…...

《地球化学》

《地球化学》主要报道近代地球化学, 特别是其主要分支学科, 如岩石地球化学、元素地球化学、有机地球化学、环境地球化学、矿床地球化学、实验地球化学、生物地球化学、天体化学、计算地球化学、分析地球化学、海洋地球化学、沉积地球化学、纳米地球化学、油气地球化学和同位素…...

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称&#xff1a;UPIrregularWidgets 插件包含以下功能 你可以点击任何图片&#xff0c;而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能&#xff0c;复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…...

南京邮电大学《2024年812自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《南京邮电大学812自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

LobeChat-46.6k星!顶级AI工具集,一键部署,界面美观易用,ApiSmart 是你肉身体验学习LLM 最好IDEA 工具

LobeChat LobeChat的开源&#xff0c;把AI功能集合到一起&#xff0c;真的太爽了。 我第一次发现LobeChat的时候&#xff0c;就是看到那炫酷的页面&#xff0c;这么强的前端真的是在秀肌肉啊&#xff01; 看下它的官网&#xff0c;整个网站的动效简直闪瞎我&#xff01; GitH…...

期权懂|场内个股期权开户流程有哪些?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 场内个股期权开户流程有哪些&#xff1f; 场内个股期权开户第一步开户‌&#xff1a; 投资者首先需要在具有期权交易资格的证券公司开立期权账户。 ‌场内个股期权开户第二步选…...

解决python 使用pip 安装模块时遇到的错误SSL: CERTIFICATE_VERIFY_FAILED

最近有一个使用python 2.7.* 使用requests模块的需求,在安装的过程中遇到了一个问题&#xff0c;在这里分享给大家&#xff01; 安装requests命令如下 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 遗憾的是&#xff0c;报错了 Collecting requests …...

智慧银行反欺诈大数据管控平台方案(四)

智慧银行反欺诈大数据管控平台的核心内容&#xff0c;是通过整合多维度、多层次的金融交易信息&#xff0c;利用先进的大数据分析、机器学习与人工智能算法&#xff0c;构建一个系统性、实时性和智能化的反欺诈管控网络&#xff0c;旨在提供全面、高效、精准的风险评估机制。该…...

前端项目开发 如何解决 error ‘val‘ is not defined no-undef 问题?

在前端开发中&#xff0c;error val is not defined no-undef 是 ESLint 报出的错误&#xff0c;表示在代码中使用了未定义的变量 val&#xff0c;但是 ESLint 没有找到它的声明。为了解决这个问题&#xff0c;通常有以下几种方法&#xff1a; 1. 检查变量是否正确声明 最常见…...

C++面试突破---C/C++基础

1.C特点 1. C在C语言基础上引入了面对对象的机制&#xff0c;同时也兼容C语言。 2. C有三大特性&#xff08;1&#xff09;封装。&#xff08;2&#xff09;继承。&#xff08;3&#xff09;多态&#xff1b; 3. C语言编写出的程序结构清晰、易于扩充&#xff0c;程序可读性好。…...

【Vue】Scoped、组件间通信、Props检验

目录 Scoped 作用 *原理 组件通信 前置知识 什么是组件通信 为什么需要组件通信 如何进行组件通信 如何辨别两个组件的关系 父子组件通信 父传子 子传父 非父子组件通信 祖先传后代 语法 任意两个组件通信 步骤 Props校验 props是什么 作用 语法 组件的…...

2022 年 9 月青少年软编等考 C 语言三级真题解析

目录 T1. 课程冲突T2. 42 点思路分析T3. 最长下坡思路分析T4. 吃糖果思路分析T5. 放苹果思路分析T1. 课程冲突 此题为 2021 年 9 月三级第一题原题,见 2021 年 9 月青少年软编等考 C 语言三级真题解析中的 T1。 T2. 42 点 42 42 42 是: 组合数学上的第 5 5 5 个卡特兰数字…...

遗传算法与深度学习实战(26)——编码卷积神经网络架构

遗传算法与深度学习实战&#xff08;26&#xff09;——编码卷积神经网络架构 0. 前言1. EvoCNN 原理1.1 工作原理1.2 基因编码 2. 编码卷积神经网络架构小结系列链接 0. 前言 我们已经学习了如何构建卷积神经网络 (Convolutional Neural Network, CNN)&#xff0c;在本节中&a…...

Svn如何切换删除账号

记录Svn清除切换账号 1.首先打开小乌龟的设置如下图 打开设置后单击已保存数据&#xff0c;然后选择清除 接上图选择清除后&#xff0c;就可以打勾选择清除已保存的账号&#xff0c;我们再次检出的就可以切换账号了 &#x1f449;总结 本次记录Svn清除切换账号 如能帮助到你…...

重生之我在异世界学编程之C语言:选择结构与循环结构篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、选择结构1. if语句2. else i…...

React第十二节组件之间通讯之发布订阅模式(使用pubsub-js插件)

组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 1、安装 pubsub-js 插件 yarn add pubsub-js 常用的事件 a、发布事件&#xff1a;传入一个自定义事件名称&#xff08;name&#xff09;&#xff0c;以及要发布的消息内…...

同为科技(TOWE)柔性定制化PDU插座

随着科技的进步&#xff0c;越来越多的精密电子设备&#xff0c;成为工作生活密不可分的工具。 电子电气设备的用电环境也变得更为复杂&#xff0c;所以安全稳定的供电是电子电气设备的生命线。 插座插排作为电子电气设备最后十米范围内供配电最终核心部分&#xff0c;便捷、安…...

【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法

C4.5 是由 Ross Quinlan 提出的决策树算法&#xff0c;是对 ID3 算法的改进版本。它在 ID3 的基础上&#xff0c;解决了以下问题&#xff1a; 处理连续型数据&#xff1a;支持连续型特征&#xff0c;能够通过划分点将连续特征离散化。处理缺失值&#xff1a;能够在特征值缺失的…...

代码随想录第36天

01背包问题 二维 def hanshu():wupin, bagweight [int(x) for x in input().split()]weight [int(x) for x in input().split()]value [int(x) for x in input().split()]dp [[0]*(bagweight1) for i in range(wupin)] #dp[i][j]代表从物品【0,i-1】让任意取&#xff0c…...

折叠屏手机拐点:三星领跌,华为小米逆势增长

科技新知 原创作者丨依蔓 编辑丨蕨影 折叠屏手机不香了&#xff1f;显示器出货量罕见下滑&#xff0c;并预计 2025 年仍将持续下降。 近日&#xff0c;市场调查机构 DSCC报告称&#xff0c; 2019 年至 2023 年&#xff0c;折叠屏市场曾保持每年至少 40% 的高速增长。然而&…...

微服务的负载均衡可以通过哪些组件实现

微服务的负载均衡可以通过多种组件来实现&#xff0c;以下是一些常见的负载均衡组件及其特点&#xff1a; Nginx&#xff1a; Nginx是一款轻量级的HTTP和反向代理服务器&#xff0c;也是一个高性能的负载均衡器。它支持多种负载均衡算法&#xff0c;如轮询、加权轮询、IP哈希等…...

uni-app写的微信小程序如何实现账号密码登录后获取token,并且每天的第一次登录后都会直接获取参数而不是耀重新登录(2)

接uni-app写的微信小程序如何实现账号密码登录后获取token&#xff0c;并且每天的第一次登录后都会直接获取参数而不是耀重新登录&#xff08;1&#xff09;&#xff0c; 在main.js中 import App from ./App// #ifndef VUE3 import Vue from vue import ./uni.promisify.adap…...

算法妙妙屋-------1.递归的深邃回响:全排列的奇妙组合

全排列的简要总结 全排列&#xff08;Permutation&#xff09;是数学中一个经典的问题&#xff0c;指的是从一组元素中&#xff0c;将所有元素按任意顺序排列形成的所有可能序列。 特点 输入条件&#xff1a; 给定一组互异的元素&#xff08;通常为数组或字符串&#xff09;。…...

flink-connector-mysql-cdc:02 mysql-cdc高级扩展

flink-connector-mysql-cdc&#xff1a;01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本&#xff1a;3.2.0flink版本&#xf…...

四、自然语言处理_02RNN基础知识笔记

1、RNN的定义 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络架构&#xff0c;它与传统的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;不同&#xff0c;主要区别在于它能够处理输入数…...

《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《船舶物资与市场》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《船舶物资与市场》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国船舶集团有限公司 主办单…...

【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)

一、包含指标&#xff1a; 股票代码 股票代码 股票简称 年份 所属城市 直辖市&#xff1a;企业所在地是否属于直辖市。1是&#xff0c;0否。 副省级城市&#xff1a;企业所在地是否属于副省级城市。1是&#xff0c;0否。 省会城市&a…...

websocket通信

“WebSocket 允许客户端和服务器在连接建立后随时互相发送数据&#xff0c;而无需每次交互都重新建立连接。”我想请问&#xff0c;第一次前端往后端发送数据时&#xff0c;传递的数据应该满足接口的参数内容&#xff0c;在第一次建立连接后之后的数据传递还是要满足接口的参数…...

数据结构——单调队列

这篇博客我们来讨论一下单调队列的问题&#xff0c;其实和之前学的单调栈都是一种上通过改变操作来解决问题的一种数据结构 我们先来回忆一下单调栈的内容&#xff0c;这样方便将其和单调队列做区分 单调栈&#xff1a;(单调性从栈底到栈顶&#xff09; 1.单调栈是一种栈数据…...

qt环境 C11thread子线程关闭定时器问题

环境情况&#xff1a;使用的是thread c11线程和qt的定时器 报错&#xff1a; QObject::~QObject: Timers cannot be stopped from another thread 主要原因&#xff1a; 1.开启了一个事件循环线程处理消息类型&#xff0c;但是有一种消息类型需要关闭资源&#xff0c;这就导…...

深入浅出:虚拟化技术及其在现代 IT 中的应用

文章目录 虚拟化的定义与基本原理虚拟机监控程序&#xff08;Hypervisor&#xff09; 虚拟化的历史与发展虚拟化的实现方式虚拟化的优势1. 提高资源利用率2. 降低成本3. 提升灵活性和可扩展性4. 加快应用部署和迁移5. 提高安全性和隔离性 不同类型虚拟化技术服务器虚拟化实际应…...

Golang内存模型总结1(mspan、mcache、mcentral、mheap)

1.内存模型 1.1 操作系统存储模型 从上到下分别是寄存器、高速缓存、内存、磁盘&#xff0c;其中越往上速度越快&#xff0c;空间越小&#xff0c;价格越高。 关键词是多级模型和动态切换 1.2 虚拟内存与物理内存 虚拟内存是一种内存管理技术&#xff0c;允许计算机使用比…...

优先算法 —— 滑动窗口系列 - 无重复字符的最长子串

目录 前言 1. 无重复字符的最长子串 2. 题目解析 3. 算法原理 解法1&#xff1a;暴力枚举 哈希表&#xff08;判断字符是否有重复出现&#xff09; 解法2&#xff1a;滑动窗口 4. 代码 前言 当我们发现暴力解法两个指针都不回退&#xff0c;都是向同一个方向移动的时候我…...

Python 浏览器自动化新利器:DrissionPage,让网页操作更简单!

Python 浏览器自动化新利器&#xff1a;DrissionPage&#xff0c;让网页操作更简单&#xff01; 文章目录 Python 浏览器自动化新利器&#xff1a;DrissionPage&#xff0c;让网页操作更简单&#xff01;&#x1f680; 引言&#x1f31f; DrissionPage简介&#x1f6e0;️ 三大…...

[Python] 进阶之路:模块、包和异常处理

在掌握了Python的类与对象后&#xff0c;下一步是深入理解模块化开发和异常处理。模块与包帮助我们组织代码&#xff0c;增强代码的可维护性和重用性&#xff0c;而异常处理则是编写健壮代码的重要技能。本文将系统讲解Python中模块、包和异常处理的核心概念与实用技巧。 一、模…...

SpringBoot 整合 Avro 与 Kafka 详解

SpringBoot 整合 Avro 与 Kafka 详解 在大数据处理和实时数据流场景中&#xff0c;Apache Kafka 和 Apache Avro 是两个非常重要的工具。Kafka 作为一个分布式流处理平台&#xff0c;能够高效地处理大量数据&#xff0c;而 Avro 则是一个用于序列化数据的紧凑、快速的二进制数…...

windows C#-使用 Override 和 New 关键字(上)

在 C# 中&#xff0c;派生类中的方法可具有与基类中的方法相同的名称。 可使用 new 和 override 关键字指定方法的交互方式。 override 修饰符用于扩展基类 virtual 方法&#xff0c;而 new 修饰符用于隐藏可访问的基类方法 。 在控制台应用程序中&#xff0c;声明以下两个类…...

FaRM译文

No compromises: distributed transactions with consistency, availability, and performance Aleksandar Dragojevic, Dushyanth Narayanan, Edmund B. Nightingale, Matthew Renzelmann, Alex Shamis, Anirudh Badam, Miguel Castro Microsoft Research 摘要 具有强一致…...

大数据新视界 -- Hive 元数据管理:核心元数据的深度解析(上)(27 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

大数据项目-Django基于聚类算法实现的房屋售房数据分析及可视化系统

《[含文档PPT源码等]精品Django基于聚类算法实现的房屋售房数据分析及可视化系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程课程答疑等&#xff01; 数据库管理工具&#xff1a;phpstudy/Navicat或者phpstudy/sqlyog 后台管理系统涉及技术&#xff1a; 后台使…...

当大的div中有六个小的div,上面三个下面三个,当外层div高变大的时候我希望里面的小的div的高也变大

问&#xff1a; 当大的div中有六个小的div&#xff0c;上面三个下面三个&#xff0c;当外层div高变大的时候我希望里面的小的div的高也变大 回答&#xff1a; 这时候我们就不能写死六个小的div的高度&#xff0c;否则上下的小的div的间距就会变大&#xff0c;因为他们的高度…...

使用 Postman 上传二进制类型的图片到后端接口写法

我们有的时候会有需求&#xff0c;就是通过 postman 传递二进制图片到后端接口&#xff0c;如下图&#xff1a; 那我们的 Java 接口需要怎么写呢&#xff1f; Spring Boot 接收这些数据的方式需要使用 RequestBody 注解来处理原始的二进制数据&#xff08;byte[]&#xff09;。…...

字符串函数和内存函数

字符串函数 1、strlcpy 【字符串拷贝】 &#xff08;将原字符串中的字符拷贝到目标字符数组中&#xff0c;包括终止符号\0&#xff0c;并在这里停止&#xff1b;为了避免越界&#xff0c;目标字符串数组应该足够大去接收&#xff09;&#x1f446; &#xff08;返回值是 dest…...

uC/OSII学习笔记(一)任务的增删改查

使用天玛智控的控制器&#xff0c;基础工程文件已移植ucosii。 正常的任务创建流程为&#xff1a; 1.OSInit()&#xff1b; 2.OSTaskCreate()&#xff1b; 3.OSStart()&#xff1b; 但是天玛对其有做修改&#xff0c;任务创建直接调用OSTaskCreate()函数即可&#xff0c;不用在…...