华为云用户手册

  • normalize函数 格式化字符串str。 使用NFC格式来格式化字符串str。 语法:normalize(str) 使用给定格式来格式化字符串str,支持的格式有NFC,NFD,NFKC,NFKD。 语法:normalize(str, form) 表46 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 form 格式化类型。 String 否 返回值类型:String类型 示例:SELECT NORMALIZE('schön'), NORMALIZE('Henry \u2163', 'nfd') 表47 查询分析结果 类型 场景1 场景2 查询语句 NORMALIZE('schön') NORMALIZE('Henry \u2163', 'nfd') 返回结果 schön Henry Ⅳ
  • string_format函数 返回以Java的String.format方式格式化的字符串。 语法:string_format(str, Object... args) 表28 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 args 参数。 String/Integer/Long/Boolean/Double 是 返回值类型:String类型 示例:SELECT STRING_FORMAT('My name is %s and I am %d years old.', 'name', age) 表29 查询分析结果 类型 场景 查询语句 STRING_FORMAT('My name is %s and I am %d years old.', 'Tom', 25) 返回结果 My name is Tom and I am 25 years old. %d:Output integer. %f:Output floating point number. %s:Output character string. %n:Output newline character. %c:Output Characters %b:Output bool type %e:Output Exponential Type %tc:Output Date and time information %tF:Output format is YYY-MM-DD. %tr:Output in HH:MM:SS PM format 可以参考Java的String.format获取更多的细节。
  • substr函数 使用起始位置和长度返回子字符串。如果没有长度参数,则返回从起始位置开始的整个字符串,同substring。 语法:substr(str, start, length) 表32 参数说明 参数名称 描述 类型 是否必选 str 原始字符串 String 是 start 开始提取子串的位置,从1开始 Integer 是 length 子串的长度 Integer 否 返回值类型:String类型 示例:SELECT SUBSTR('helloworld', 5), SUBSTR('helloworld', 5, 3) 表33 查询分析结果 类型 场景1 场景2 查询语句 SUBSTR ('helloworld', 5) SUBSTR ('helloworld', 5, 3) 返回结果 oworld owo
  • split_to_map函数 使用指定的第一个分隔符拆分字符串,然后使用指定的第二个分隔符第二次拆分字符串。返回第二次拆分后的结果。 语法:split_to_map(str, splitStr1, splitStr2) 表26 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 splitStr1 分隔符1。 String 是 splitStr2 分隔符2。 String 是 返回值类型:ARRAY类型 示例:SELECT SPLIT_TO_MAP('upstream_response_time:123, request_time:456', ',', ':') 表27 查询分析结果 类型 场景 查询语句 SPLIT_TO_MAP('upstream_response_time:123, request_time:456', ',', ':') 返回结果 {" request_time":"456","upstream_response_time":"123"}
  • strpos函数 查询目标子串初次出现在字符串中的位置,如果目标子串未出现在字符串中,则返回0。 语法:strpos(str, subStr) 表30 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 subStr 填充字符。 String 是 返回值类型:Integer类型 示例:SELECT STRPOS('hello world', 'llo'), STRPOS('llo', 'hello world') 表31 查询分析结果 类型 场景1 场景2 查询语句 STRPOS('hello world', 'llo') STRPOS('llo', 'hello world') 返回结果 3 0
  • substring函数 使用起始位置和长度返回子字符串。如果没有长度参数,则返回从起始位置开始的整个字符串。 语法:substring(str, start, length) 表34 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 start 开始提取子串的位置,从1开始。 Integer 是 length 子串的长度。 Integer 否 返回值类型:String类型 示例:SELECT SUBSTRING('helloworld', 5), SUBSTRING('helloworld', 5, 3) 表35 查询分析结果 类型 场景1 场景2 查询语句 SUBSTRING('helloworld', 5) SUBSTRING('helloworld', 5, 3) 返回结果 oworld owo
  • contains_string函数 判断字符串是否包含指定字符串。 语法:contains_string(str, containsStr) 表12 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 containsStr 指定字符串。 String 是 返回值类型:Boolean类型 示例:SELECT CONTAINS_STRING('hello world', 'llo') 表13 查询分析结果 类型 场景 查询语句 CONTAINS_STRING('hello world', 'llo') 返回结果 true
  • parse_long函数 将字符串转换成基于指定基数的Long型,如果未指定基数,则基于十进制对原始字符串进行转换。 语法:parse_long(str, radix) 表20 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 radix 基数。 Integer 否 返回值类型:Long类型 示例:SELECT PARSE_LONG('-1234', 8), PARSE_LONG('1234') 表21 查询分析结果 类型 场景1 场景2 查询语句 PARSE_LONG('-1234', 8) PARSE_LONG('1234') 返回结果 -668 1234
  • split_part函数 使用指定的分隔符拆分字符串,并返回指定位置的字符串。如果拆分后指定的位置超过数组的长度,则返回“”。 语法:split_part(str, splitStr, position) 表24 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 splitStr 分隔符。 String 是 position 需要返回的字符串的位置。 Integer 是 返回值类型:STRING类型 示例:SELECT SPLIT_PART('helloworld', 'o', 2), SPLIT_PART('helloworld', 'o', 4) 表25 查询分析结果 类型 场景1 场景2 查询语句 SPLIT_PART('helloworld','o', 2) SPLIT_PART('helloworld', 'o', 4) 返回结果 w
  • icontains_string函数 判断字符串是否包含指定字符串,字符串不区分大小写。 语法:icontains_string(str, containsStr) 表14 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 containsStr 指定字符串。 String 是 返回值类型:Boolean类型 示例:SELECT ICONTAINS_STRING('hello world', 'llo') 表15 查询分析结果 类型 场景 查询语句 ICONTAINS_STRING('hello world', 'llo') 返回结果 true
  • textcat函数 将两个字符串拼接起来,返回拼接后的结果。 语法:textcat(str1, str2) 表16 参数说明 参数名称 描述 类型 是否必选 str1 待拼接字符串1。 String 是 str2 待拼接字符串2。 String 是 返回值类型:String类型 示例:SELECT TEXTCAT('hello ', 'world') 表17 查询分析结果 类型 场景 查询语句 TEXTCAT('hello ', 'world') 返回结果 hello world
  • rpad函数 在字符串的结尾填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 语法:rpad(str, len, rpadStr) 表4 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 len 结果字符串的长度。 如果原始字符串的长度小于len,那么在字符串的结尾填充指定的字符。 如果原始字符串的长度大于len,那么只返回字符串的len个字符。 Integer 是 rpadStr 填充字符。 String 否 返回值类型:String类型 示例:SELECT RPAD('hello world', 10), RPAD('hello', 10, 'e') 表5 查询分析结果 类型 场景1 场景2 查询语句 RPAD('hello world', 10) RPAD('hello', 10, 'e') 返回结果 hello worl helloeeeee
  • replace函数 将字符串中的匹配字符串替换成指定的字符串,如果未指定替换字符串,则将匹配的字符串从原来的字符串中删除。 语法:replace(str, subStr, replaceStr) 表6 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 subStr 目标子串。 String 是 replaceStr 用于替换的字符串。 String 否 返回值类型:String类型 示例:SELECT REPLACE('hello world', 'o'), REPLACE('hello world', 'w', 'new w') 表7 查询分析结果 类型 场景1 场景2 查询语句 REPLACE('hello world', 'o') REPLACE('hello world', 'w', 'new w') 返回结果 hell wrld hello new world
  • lpad函数 在字符串的开头填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 语法:lpad(str, len, lpadStr) 表2 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 len 结果字符串的长度。 如果原始字符串的长度小于len,那么在字符串的开头填充指定的字符。 如果原始字符串的长度大于len,那么只返回字符串的len个字符。 int 是 lpadStr 填充字符。 String 否 返回值类型:String类型 示例:SELECT LPAD('hello world', 10), LPAD('hello', 10, 'e') 表3 查询分析结果 类型 场景1 场景2 查询语句 LPAD('hello world', 10) LPAD('hello', 10, 'e') 返回结果 hello worl eeeeehello
  • repeat函数 将字符串重复指定次数。 语法:repeat(str, num) 表10 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 num 重复次数 Integer 是 返回值类型:String类型 示例:SELECT REPEAT('hello world', 2), REPEAT('hello world', 0) 表11 查询分析结果 类型 场景1 场景2 查询语句 REPEAT('hello world', 2) REPEAT('hello world', 0) 返回结果 hello worldhello world
  • 函数列表 表1 字符串函数 函数 描述 lpad函数 在字符串的开头填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 rpad函数 在字符串的结尾填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 replace函数 将字符串中的匹配字符串替换成指定的字符串,如果未指定替换字符串,则将匹配的字符串从原来的字符串中删除。 reverse函数 将字符串转换成反向顺序的字符串。 repeat函数 将字符串重复指定次数。 contains_string函数 判断字符串是否包含指定字符串。 icontains_string函数 判断字符串是否包含指定字符串,字符串不区分大小写。 textcat函数 将两个字符串拼接起来,返回拼接后的结果。 btrim函数 删除字符串左右两侧的空格。 parse_long函数 将字符串转换成基于指定基数的Long型,如果未指定基数,则基于十进制对原始字符串进行转换。 split函数 使用指定的分隔符拆分字符串,并返回子字符串的集合。如果设置了limit,则使用limit限制拆分字符串的数量。 split_part函数 使用指定的分隔符拆分字符串,并返回指定位置的字符串。如果拆分后指定的位置超过数组的长度,则返回“”。 split_to_map函数 使用指定的第一个分隔符拆分字符串,然后使用指定的第二个分隔符第二次拆分字符串,返回第二次拆分后的结果。 string_format函数 返回以Java的String.format方式格式化的字符串。 strpos函数 查询目标子串初次出现在字符串中的位置,如果目标子串未出现在字符串中,则返回0。 substr函数 使用起始位置和长度返回子字符串。如果没有长度参数,则返回从起始位置开始的整个字符串,同substring。 substring函数 使用起始位置和长度返回子字符串。如果没有长度参数,则返回从起始位置开始的整个字符串。 length函数 如果字符串表达式是字符数据类型,则返回输入的字符长度;否则,返回字符串表达式的字节长度(不小于位数除以8的最小整数)。 char_length函数 与length函数功能一致,如果字符串表达式是字符数据类型,则返回输入的字符长度;否则,返回字符串表达式的字节长度(不小于位数除以8的最小整数)。 character_length函数 与length函数功能一致。 strlen函数 与length函数功能一致。 levenshtein_distance函数 计算两个字符串str1和str2之间的最小编辑距离。 normalize函数 格式化字符串。 to_utf8函数 将字符串转换为UTF-8编码格式。 chr函数 将ascii值转换成字符。 concat函数 用于将多个参数拼接成一个字符串。
  • 参数获取方式 上线区域表,使用华为云主机时参考以下信息: 表2 区域表 区 域名 称 区域 终端节点 华北-北京四 cn-north-4 https://lts-access.cn-north-4.myhuaweicloud.com:8102 华东-上海一 cn-east-3 https://lts-access.cn-east-3.myhuaweicloud.com:8102 华南-广州 cn-south-1 https://lts-access.cn-south-1.myhuaweicloud.com:8102 亚太-新加坡 ap-southeast-3 https://lts-access.ap-southeast-3.myhuaweicloud.com:8102 当前仅华北-北京四、华东-上海一、华南-广州区域使用SDK时支持跨云/本地上报日志,Endpoint端口使用443。 日志组ID:在 云日志 服务控制台,选择“日志管理”,鼠标悬浮在日志组名称上,可查看日志组名称和日志组ID。 日志流ID:单击日志组名称对应的按钮,鼠标悬浮在日志流名称上,可查看日志流名称和日志流ID。
  • 配置参数说明 producer config参数说明。 参数名称 描述 类型 是否需要填写 默认值 projectId 华为云账号的项目ID(project id)。 String 必填 - ak 华为云账号的AK。 String 必填 - sk 华为云账号的SK。 String 必填 - region 云日志服务的区域。 String 必填 - endpoint 上报目的。 String 必填 - logGroup LTS的日志组ID。 string 必填 - logStream LTS的日志流ID。 string 必填 - 日志生成GenerateLog方法类参数说明。单次上报条数小于4096条,且小于512K。 参数名称 描述 类型 是否需要填写 contents 批量日志内容。 []string 是 labels 日志标签,map格式。 map[string]string 是 日志上报SendLog方法类参数说明。 表1 SendLog方法类参数说明 参数名称 描述 类型 是否需要填写 groupId 日志组id string 是 streamId 日志流id string 是 log 日志结构 class Log 是
  • 安装Python SDK 获取LTS Python SDK包源码。 git clone https://gitee.com/lordstar-habile/huaweicloud-lts-python-sdk.git 安装相关依赖。 pip3 install requests pip3 install loguru pip3 install six 编写上报日志代码。 可以自定义发送成功与失败时的回调方法,实现方式请参考如下命令:创建CallBack对象,实现invoke_on_success和invoke_on_failed方法,并且在发送日志时直接使用。 class CallBack(object): def invoke_on_success(self, result): pass def invoke_on_failed(self, result): pass 示例如下: import random import time from concurrent.futures import ThreadPoolExecutor from loguru import logger from producer.core.producer import Producer from producer.callback.call_back import CallBack from producer.model import lts_store from producer.model.config import Config from producer.utils import common def generate_random_str(str_len=16): """ 生成一个指定长度的随机字符串 """ random_str = '' base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' length = len(base_str) - 1 for i in range(str_len): random_str += base_str[random.randint(0, length)] return random_str def send_log_single_producer(): thread_num = 100 threads = [] begin_ms = common.current_time_ms() submit_send_log_thread_pool = ThreadPoolExecutor(max_workers=thread_num, thread_name_prefix="send_log_thread") config = Config() config.endpoint = "" config.access_key = "" config.access_secret = "" config.region_id = "" config.project_id = "" producer = Producer.init_producer(config) producer.start_producer() group_id = "" stream_id = "" log_content = generate_random_str(1024) log = [log_content] labels = {"keyA": "valueA"} log_p = lts_store.generate_log(log, labels) for i in range(thread_num): new_thread = submit_send_log_thread_pool.submit(send_log_function, producer, group_id, stream_id, log_p) threads.append(new_thread) for t in threads: t.result() end_ms = common.current_time_ms() logger.info("end send log, cost [{}]ms", end_ms - begin_ms) def send_log_function(one_producer, group_id, stream_id, log_p): for i in range(2000): one_producer.send_log_with_callback(group_id, stream_id, log_p) class MyCallBack(CallBack): def invoke_on_success(self, result): logger.info("send log success") def invoke_on_failed(self, result): logger.error("send log success") if __name__ == '__main__': send_log_single_producer() time.sleep(1000)
  • 加强权限管理 配置 IAM 用户实现权限隔离 CSS 服务支持通过IAM对用户权限进行精细化管理,通过设置不同的企业组织和操作权限,达到对 CS S集群的访问权限隔离。IAM权限配置请参见创建IAM用户并授权使用CSS。 避免直接使用管理员账号访问集群 安全模式的Elasticsearch集群和OpenSearch集群拥有默认管理员账号admin,管理员账号拥有最高权限,可以访问集群中的任意数据,建议通过设置集群的普通用户去使用集群。通过Kibana或OpenSearch Dashboards配置普通用户访问集群索引数据的权限。用户权限基于用户(User)、权限(Permission)、角色(Role)管理,可以基于业务需求配置用户角色和权限。操作指导请参见创建Elasticsearch集群用户并授权使用或创建OpenSearch集群用户并授权使用。
  • 启用安全配置 创建安全模式的集群 CSS服务给Elasticsearch集群和OpenSearch集群提供了安全模式。安全模式的集群需要通过用户名和密码验证才能访问,非安全模式的集群则不需要安全认证即可直接访问。除非业务环境进行了严格的网络控制,且数据重要程度低,否则不建议您创建非安全模式的集群。集群安全模式的切换请参见更改Elasticsearch集群安全模式或更改OpenSearch集群安全模式。 开启HTTPS访问 如果Elasticsearch集群和OpenSearch集群未配置SSL加密通信,那么在CSS客户端和服务器之间传输数据时,很容易受到窃听、篡改和“中间人”攻击。为了提高数据传输的安全性,建议您创建安全模式的集群,并开启HTTPS访问。由于加密解密开销,启用HTTPS后集群性能可能下降约20%,建议评估业务场景的性价比。集群访问协议切换请参见更改Elasticsearch集群安全模式或更改OpenSearch集群安全模式。 避免绑定EIP直接通过互联网访问集群 避免将CSS集群部署在公网或者DMZ里,应该部署在公司内部网络,并使用路由器或者防火墙技术把集群保护起来,避免通过直接绑定弹性公网IP(简称EIP)的方式从互联网访问集群,防止未授权的访问及DDoS攻击等。为避免公网暴露风险,建议关闭集群的公网访问,如果业务必须通过公网访问,请配置独享型负载均衡访问CSS集群,并严格配置独享型负载均衡器的安全组规则限制。操作指导请参见配置Elasticsearch集群独享型负载均衡或配置OpenSearch集群独享型负载均衡。
  • 提升账号密码安全性 定期重置管理员用户的密码 安全模式的Elasticsearch集群和OpenSearch集群拥有默认管理员账号admin,管理员账号拥有最高权限,建议定期重置密码。通过定期重置策略,可有效降低密码泄露风险,显著提升账户安全性,保护敏感数据和系统免受潜在的安全威胁。操作指导请参见CSS服务中如何重置安全集群的管理员密码? 提升密码复杂度 CSS服务的Elasticsearch集群和OpenSearch集群作为搜索引擎,易成为攻击者的目标。用户需要妥善保存集群的访问账号与密码,避免泄漏。同时建议您提升密码的复杂度,避免使用弱密码。CSS会对集群的管理员密码进行复杂度校验,建议密码长度不少于12位,包含大小写字母、数字及特殊字符(如!@#$%)的组合,防止密码强度过低导致密码被破解。
  • 约束限制 Elasticsearch中的_id字段必须与MySQL中的id字段相同。 这是为了确保当MySQL中的记录写入Elasticsearch时,同步任务可在MySQL记录与Elasticsearch索引之间建立一个直接映射的关系。例如,当MySQL中更新了某条记录时,同步任务会覆盖Elasticsearch中与更新记录具有相同ID的索引。 当MySQL中插入或者更新数据时,对应记录必须有一个包含更新或插入时间的字段。 Logstash在每次轮询MySQL时,会记录最后读取记录的时间戳,并在下一次读取时只获取该时间戳之后更新或插入的符合条件的记录。 确保MySQL数据库、Logstash集群和Elasticsearch集群在同一时区,否则当同步与时间相关的数据时,同步前后的数据可能存在时区差。
  • 前提条件 已准备好存有数据的MySQL数据库,本案例以云数据库的RDS for MySQ L实例 为例,具体操作请参见购买RDS for MySQL实例。 已准备好用于同步数据的Logstash集群,具体操作请参见创建Logstash集群。本文以7.10.0版本的Logstash集群为例。 已准备好Elasticsearch集群,具体操作请参见创建Elasticsearch集群。本文以7.10.2版本的Elasticsearch集群为例。 以上三者在同一VPC下面。 当使用的是自建或第三方MySQL数据库时,则需要确认数据库驱动是否是MariaDB驱动。 是,则可以直接开始配置数据同步。 否,则需要参考常见问题:MySQL驱动不兼容怎么办?上传与RDS版本兼容的SQL JDBC驱动到Logstash集群中。
  • 应用场景 CSS服务的Logstash集群默认安装了logstash-input-jdbc插件,该插件为Logstash提供了从关系型数据库RDS MySQL中导入和处理数据的能力,通过配置Logstash配置文件,定义JDBC输入和Elasticsearch输出,实现定期同步数据库中的数据到Elasticsearch。该方案可以用于以下场景: 数据实时更新与同步:将RDS MySQL中的数据实时同步到Elasticsearch,以便利用Elasticsearch强大的搜索和分析能力。 日志分析 与检索:将MySQL中的日志数据同步到Elasticsearch,进行快速检索和分析。 应用性能监控:将应用性能数据存储在MySQL中,通过Logstash同步到Elasticsearch,进行实时监控和性能分析。 数据备份与恢复:通过Logstash将MySQL数据备份到Elasticsearch,以便在数据丢失或损坏时快速恢复。
  • 方案架构 图1 RDS MySQL数据同步至Elasticsearch 使用Logstash将RDS MySQL数据同步至Elasticsearch的方案流程如图1所示。 在CSS服务的Logstash中通过默认插件logstash-input-jdbc,在Logstash配置文件中配置数据库JDBC输入和Elasticsearch输出,将全量或增量RDS MySQL数据实时同步至Elasticsearch。
  • 迁移时长 迁移过程的耗时长短依赖于源集群和目标集群的节点个数或索引shard个数。迁移过程分为备份阶段和恢复阶段,备份阶段耗时由源集群决定,恢复阶段耗时由目标集群决定。迁移总时长的评估公式如下: 当索引shard个数大于节点个数时 总时长(s)= 集群迁移的数据量(GB)÷ 40MB ÷(源集群节点个数+目的集群节点个数)x 索引个数 当索引shard个数小于节点个数时 总时长(s)= 集群迁移的数据量(GB)÷ 40MB ÷(源集群索引shard个数+目的集群索引shard个数)x 索引个数 评估公式是基于理想状态下(即单节点以最快速度40MB/s传输)的迁移时长,实际迁移时长还会受到网络、资源等因素影响。
  • 应用场景 通过备份与恢复实现华为云Elasticsearch集群间数据迁移仅适用于源集群和目标集群都是CSS服务的集群,且依赖 对象存储服务 OBS。常用于以下场景: 跨地域或跨账号迁移:将其他Region或账号下的Elasticsearch集群迁移到当前集群中。 跨版本迁移:将低版本的Elasticsearch集群数据迁移到高版本的集群中。 集群合并:将两个Elasticsearch集群的索引数据合并到一个集群中。
  • 方案优势 易于操作和管理:在CSS服务控制台使用集群快照功能实现备份恢复,操作简单,且易于管理和自动化。 适用于大规模数据迁移:快照备份适用于数据量大的场景,特别是当数据量达到GB、TB甚至PB级别时。 支持跨地域和跨账号迁移:通过结合OBS的跨区域复制功能,可以实现跨地域和跨账号的数据迁移。 恢复过程可控:在恢复数据时,可以选择恢复特定索引或全部索引,并且可以指定恢复到特定的集群状态。 迁移时长可控:基于迁移时长评估公式可以配置数据迁移速率,理想状态下等于文件复制速率。
  • 步骤四:创建知识库 如果需要基于知识库进行智能问答,则需要在Dify平台配置知识库。 在Dify平台上方选择“知识库”。 单击“创建知识库”。 选择“导入已有文本”,上传文本文件。 单击“下一步”,根据业务需要设置知识库,其中Embedding模型和Rerank模型选择1接入的模型。 图8 设置知识库 单击“保存并处理”,等待知识库嵌入完成。此时,文本文件就通过Dify平台调用Embedding搜索大模型写入了OpenSearch向量数据库。 单击“前往文档”,进入知识库。 单击左侧“召回测试”,验证是否可以正常召回文本内容。 如图9所示,回答正确,表示文档召回成功。 图9 召回测试
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全