elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester(补全建议)

Elasticsearch7.15安装

官方文档
补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能,引导用户在输入时找到相关结果,提高搜索精度。
理想情况下,自动补全功能应该和用户输入一样快,以便为用户提供与已输入内容相关的即时反馈。因此,completion建议器针对速度进行了优化。建议器使用的数据结构支持快速查找,但构建成本很高,并且存储在内存中。

拼音分词插件elasticsearch-analysis-pinyin安装

源码地址:https://gitcode.com/medcl/elasticsearch-analysis-pinyin/overview

  • idea通过git(https://gitcode.com/medcl/elasticsearch-analysis-pinyin.git)导入项目

  • 切换到分支7.x

  • 修改pom.xml,elasticsearch.version 版本号为7.15.0
    在这里插入图片描述

  • 执行maven打包命令

    mvn clean package "-Dmaven.test.skip=true"
    

    执行命令以后生成的插件:
    在这里插入图片描述

  • 将elasticsearch-analysis-pinyin-7.15.0.zip上传到服务器elasticsearch安装目录,修改文件权限为elasticsearch用户权限,笔者的用户是hadoop.

    chown  hadoop:hadoop elasticsearch-analysis-pinyin-7.15.0.zip
    
  • 进入elasticsearch安装目录执行命令安装插件

    sh ./bin/elasticsearch-plugin install file:elasticsearch-analysis-pinyin-7.15.0.zip
    

    在这里插入图片描述

  • 重新启动elasticsearch

    # 停止
    kill -9 进程id
    #启动
    sh ./bin/elasticsearch -d
    
  • 查询插件是否安装成功

    GET _cat/plugins
    

    在这里插入图片描述

  • 拼音插件参数说明
    The plugin includes analyzer: pinyin , tokenizer: pinyin and token-filter: pinyin.

    • keep_first_letter 当启用此选项时, eg: 刘德华>ldh, default: true
    • **keep_separate_first_letter ** 当此选项启用时,将单独保留首字母, eg: 刘德华>l,d,h, default: false, NOTE: 由于查询词的频率过高,查询结果可能会过于模糊
    • limit_first_letter_length set max length of the first_letter result, default: 16
    • keep_full_pinyin when this option enabled, eg: 刘德华> [liu,de,hua], default: true
    • keep_joined_full_pinyin when this option enabled, eg: 刘德华> [liudehua], default: false
    • keep_none_chinese 结果中保留非中文字母或数字, default: true
    • keep_none_chinese_together keep non chinese letter together, default: true, eg: DJ音乐家 -> DJ,yin,yue,jia, when set to false, eg: DJ音乐家 -> D,J,yin,yue,jia, NOTE: keep_none_chinese should be enabled first
    • keep_none_chinese_in_first_letter keep non Chinese letters in first letter, eg: 刘德华AT2016->ldhat2016, default: true
    • keep_none_chinese_in_joined_full_pinyin keep non Chinese letters in joined full pinyin, eg: 刘德华2016->liudehua2016, default: false
    • none_chinese_pinyin_tokenize 如果非汉语字母是拼音,则将其拆分成单独的拼音术语, default: true, eg: liudehuaalibaba13zhuanghan -> liu,de,hua,a,li,ba,ba,13,zhuang,han, NOTE: keep_none_chinese and keep_none_chinese_together should be enabled first
    • keep_original 将非中文字母分成单独的拼音词,如果它们是拼音时,此选项启用,将保持原始输入, default: false
    • lowercase lowercase non Chinese letters, default: true
    • trim_whitespace default: true
    • remove_duplicated_term when this option enabled, duplicated term will be removed to save index, eg: de的>de, default: false, NOTE: position related query maybe influenced
    • ignore_pinyin_offset after 6.0, offset is strictly constrained, overlapped tokens are not allowed, with this parameter, overlapped token will allowed by ignore offset, please note, all position related query or highlight will become incorrect, you should use multi fields and specify different settings for different query purpose. if you need offset, please set it to false. default: true.

创建索引

PUT hot_word
{
  "settings": {
    "routing": {
      "allocation": {
        "include": {
          "_tier_preference": "data_content"
        }
      }
    },
    "number_of_shards": "1",
    "max_result_window": "10000",
    "number_of_replicas": "1",
    "analysis": {
      "analyzer": {
        "pinyin_analyzer": {
          "tokenizer": "my_pinyin"
        }
      },
      "tokenizer": {
        "my_pinyin": {
          "type": "pinyin",
          "keep_separate_first_letter": true,
          "keep_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "lowercase": true,
          "remove_duplicated_term": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "suggest": {
            "type": "completion",
            "analyzer": "pinyin_analyzer",
            "preserve_separators": true,
            "preserve_position_increments": true,
            "max_input_length": 50
          }
    }
  }
}

类型completion 参数:

参数说明
analyzer要使用的索引分析器默认为simple。
search_analyzer要使用的搜索分析器,默认值为analyzer。
preserve_separators保留分隔符,默认为true。如果禁用,你可以找到一个以Foo Fighters开头的字段,如果你建议使用foof。
preserve_position_increments启用位置增量,默认为true如果禁用并使用停用词分析器,你可以得到一个以The Beatles开头的字段,如果你建议使用b。注意:你也可以通过索引两个输入,Beatles和The Beatles来实现这一点,如果你能够丰富数据,则无需更改简单的分析器。
max_input_length限制单个输入的长度,默认为50个UTF-16代码点。这个限制只在索引时用于减少每个输入字符串的字符总数,以防止大量输入使底层数据结构膨胀。大多数用例都不受默认值的影响,因为前缀补全的长度很少超过几个字符。

添加数据

PUT hot_word/_doc/1?refresh
{
  "name":"压克力盒",
  "suggest":{
    "input":["压克力盒"],
    "weight":10
  }
}
PUT hot_word/_doc/2?refresh
{
  "name":"亚克力盒",
  "suggest":{
    "input":["亚克力盒"],
    "weight":10
  }
}
PUT hot_word/_doc/3?refresh
{
  "name":"刻磨機",
  "suggest":{
    "input":["刻磨機"],
    "weight":10
  }
}
PUT hot_word/_doc/4?refresh
{
  "name":"刻模机",
  "suggest":{
    "input":["刻模机"],
    "weight":10
  }
}

suggest参数说明:

参数说明备注
input要存储的输入,可以是一个字符串数组,也可以只是一个字符串。该字段是必填字段。此值不能包含以下UTF-16控制字符:\u0000 (null),\u001f (information separator one),\u001f (information separator one)
weight一个正整数或包含一个正整数的字符串,它定义了权重,允许你对建议进行排序。该字段是可选的。

查询

GET hot_word/_search?pretty
{
  "_source": ["suggest"], 
  "suggest": {
    "song-suggest": {
      "prefix": "关键词",
      "completion": {
        "field": "suggest",
        "size": 10,
        "skip_duplicates": true
      }
    }
  }
}

参数说明:

  • suggest: suggest类型
  • song-suggest: suggest名称,自定义命名
  • prefix:搜索建议时使用的前缀
  • completion: 建议类型
  • field:搜索建议的字段名称
  • size:返回的建议条数,默认5
  • skip_duplicates:是否应该过滤重复的建议(默认为false)。

测试:

  • 测试中文输入关键词:亚,亚克、亚克力、亚克力盒,正常返回补全结果:

    {
      "took" : 6,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 0,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [ ]
      },
      "suggest" : {
        "song-suggest" : [
          {
            "text" : "亚克力",
            "offset" : 0,
            "length" : 3,
            "options" : [
              {
                "text" : "亚克力盒",
                "_index" : "hot_word",
                "_type" : "_doc",
                "_id" : "2",
                "_score" : 10.0,
                "_source" : {
                  "suggest" : {
                    "input" : [
                      "亚克力盒"
                    ],
                    "weight" : 10
                  }
                }
              },
              {
                "text" : "压克力盒",
                "_index" : "hot_word",
                "_type" : "_doc",
                "_id" : "1",
                "_score" : 10.0,
                "_source" : {
                  "suggest" : {
                    "input" : [
                      "压克力盒"
                    ],
                    "weight" : 10
                  }
                }
              }
            ]
          }
        ]
      }
    }
    
    
  • 测试拼音输入:ya、yake,yakelihe,yakelihe,正常返回补全结果:

    {
      "took" : 7,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 0,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [ ]
      },
      "suggest" : {
        "song-suggest" : [
          {
            "text" : "yakelihe",
            "offset" : 0,
            "length" : 8,
            "options" : [
              {
                "text" : "亚克力盒",
                "_index" : "hot_word",
                "_type" : "_doc",
                "_id" : "2",
                "_score" : 10.0,
                "_source" : {
                  "suggest" : {
                    "input" : [
                      "亚克力盒"
                    ],
                    "weight" : 10
                  }
                }
              },
              {
                "text" : "压克力盒",
                "_index" : "hot_word",
                "_type" : "_doc",
                "_id" : "1",
                "_score" : 10.0,
                "_source" : {
                  "suggest" : {
                    "input" : [
                      "压克力盒"
                    ],
                    "weight" : 10
                  }
                }
              }
            ]
          }
        ]
      }
    }
    
    
  • 测试拼音首字母输入:y、yk、ykl、yklh,正常返回补全结果。支持首字母补全,pinyin需要设置keep_separate_first_letter为true。

  • 测试同音字输入:鸭,鸭课,正常返回补全结果。

  • 测试简繁体输入:刻模机,正常返回简繁体补全结果。

模糊查询

completion建议器还支持模糊查询——这意味着即使你在搜索中输入错误,仍然可以得到结果。

GET hot_word/_search?pretty
{
  "_source": ["suggest"], 
  "suggest": {
    "song-suggest": {
      "prefix": "关键词",
      "completion": {
        "field": "suggest",
        "size": 10,
        "skip_duplicates": true,
        "fuzzy": {
          "fuzziness": 2,
          "min_length":4,
          "prefix_length":4,
          "transpositions": false,
          "unicode_aware":true
        }
      }
    }
  }
}

模糊查询fuzzy参数说明:

  • fuzziness:作用:决定模糊匹配的程度。默认值为AUTO,意味着根据查询项的长度自动调整模糊匹配的严格程度。也可以手动设置为具体的值,如0(精确匹配)、1(允许一个编辑距离内的匹配)等,或者使用其他特定的字符串值(如"AUTO"、“1”、“2”)。
  • transpositions:如果设置为true(默认值),则在计算编辑距离时把字符的交换视为一个变化而不是两个。这对于那些可能因快速打字而产生的常见转置错误(比如"thsi"到"this")非常有用。
  • min_length:只有当查询字符串长度达到这个值时,才会返回模糊建议。默认为3,意味着较短的查询可能不会触发模糊匹配,以减少不相关的匹配结果。
  • prefix_length:指定了查询字符串中从开始部分的多少个字符必须精确匹配,之后的字符才开始应用模糊匹配算法。默认为1,意味着除了最小长度要求外,所有字符都可能被模糊处理。增加这个值可以提高查询的精确度,尤其是在查询字符串较短时。
  • unicode_aware:确定是否在进行模糊匹配计算时考虑Unicode编码。如果设为true,则编辑距离、转置等计算都会基于Unicode码点进行,这使得多语言文本的处理更为准确。但因为涉及到更复杂的计算,所以默认为false以追求更快的性能。

测试输入“亚可爱”,正常返回补全结果:

{
  "took" : 44,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "suggest" : {
    "song-suggest" : [
      {
        "text" : "亚可爱",
        "offset" : 0,
        "length" : 3,
        "options" : [
          {
            "text" : "亚克力盒",
            "_index" : "hot_word",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 40.0,
            "_source" : {
              "suggest" : {
                "input" : [
                  "亚克力盒"
                ],
                "weight" : 10
              }
            }
          },
          {
            "text" : "压克力盒",
            "_index" : "hot_word",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 40.0,
            "_source" : {
              "suggest" : {
                "input" : [
                  "压克力盒"
                ],
                "weight" : 10
              }
            }
          }
        ]
      }
    ]
  }
}

Java实现

easy-es实现:https://www.easy-es.cn/,这个框架建议索引设置为手动,自动索引还不是很稳定

  • 添加maven依赖:
        <!-- 引入easy-es最新版本的依赖-->
        <dependency>
            <groupId>org.dromara.easy-es</groupId>
            <artifactId>easy-es-boot-starter</artifactId>
            <!--这里Latest Version是指最新版本的依赖,比如2.0.0,可以通过下面的图片获取-->
            <version>v2.0.0</version>
        </dependency>

        <!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-high-level-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.14.0</version>
        </dependency>

  • java实体关键代码:
/**
     * 自动补齐字段
     */
    @IndexField(fieldType = FieldType.NESTED, nestedClass = SearchHotWordV2IDX.HotSuggest.class)
    private SearchHotWordV2IDX.HotSuggest suggest;


    @Data
    public static class HotSuggest {
        @IndexField(fieldType = FieldType.INTEGER)
        private Integer weight;
        @IndexField(fieldType = FieldType.KEYWORD)
        private List<String> input;
    }
  • 新增
    使用mapper直接调用就可以
  • 查询关键代码:
    private static final String HOT_KEYWORD_SUGGEST_NAME = "hot-suggest";
	public List<String> autoComplete(String keyword, Boolean fuzzy) {
        LambdaEsQueryWrapper<SearchHotWordV2IDX> queryWrapper = new LambdaEsQueryWrapper<SearchHotWordV2IDX>();
        queryWrapper.select(SearchHotWordV2IDX::getSuggest);
        String newKeyword = Optional.ofNullable(keyword)
                .map(a -> a.toLowerCase())
                .map(b -> StrUtil.sub(b, 0, 10)).orElseThrow(RuntimeException::new);
        // 定义建议构造器
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        // 自动补全补齐构造器
        CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder("suggest")
                .size(20)
                .skipDuplicates(true);
        if (fuzzy) {
            // 设置模糊查询
            FuzzyOptions fuzzyOptions = FuzzyOptions.builder()
                    .setFuzziness(2)
                    .setFuzzyMinLength(4)
                    .setFuzzyPrefixLength(4).build();
            completionSuggestionBuilder.prefix(newKeyword, fuzzyOptions);
        } else {
            completionSuggestionBuilder.prefix(newKeyword);
        }
        // 自动补全添加到建议构造器
        suggestBuilder.addSuggestion(HOT_KEYWORD_SUGGEST_NAME, completionSuggestionBuilder);
        SearchSourceBuilder searchSourceBuilder = searchHotWordV2EsMapper.getSearchSourceBuilder(queryWrapper);
        // 建议器添加到searchSourceBuilder
        searchSourceBuilder.suggest(suggestBuilder);
        // queryWrapper设置searchSourceBuilder
        queryWrapper.setSearchSourceBuilder(searchSourceBuilder);
        // 查询
        SearchResponse response = searchHotWordV2EsMapper.search(queryWrapper);
        Suggest suggest = response.getSuggest();
        // 获取自动补全结果
        CompletionSuggestion completionSuggestion = suggest.getSuggestion(HOT_KEYWORD_SUGGEST_NAME);
        return Optional.ofNullable(completionSuggestion.getOptions())
                .map(a -> a.stream().map(b -> b.getText().string()).collect(Collectors.toList())).orElse(null);

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/665316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chap5 CNN

卷积神经网络&#xff08;CNN&#xff09; 问题描述&#xff1a; 利用卷积神经网络&#xff0c;实现对MNIST数据集的分类问题 数据集&#xff1a; MNIST数据集包括60000张训练图片和10000张测试图片。图片样本的数量已经足够训练一个很复杂的模型&#xff08;例如 CNN的深层…

【课程总结】Day4:信息论和决策树算法

前言 本章内容主要是学习机器学习中的一个重要模型&#xff1a;决策树&#xff0c;围绕决策树的应用&#xff0c;我们展开了解到&#xff1a;熵的定义、熵的计算、决策树的构建过程(基于快速降熵)、基尼系数等&#xff0c;从而使得我们对决策树有了直观认识。 熵的介绍 因为…

U盘损坏打不开?数据恢复攻略全解析

随着信息技术的飞速发展&#xff0c;U盘已成为我们日常工作和生活中不可或缺的数据存储工具。然而&#xff0c;当U盘突然损坏&#xff0c;无法打开时&#xff0c;我们往往会陷入焦虑和无助之中。本文将为大家详细解析U盘损坏打不开的原因&#xff0c;并提供两种有效的数据恢复方…

【stm32】stm32f407 ch340下载

一、接线 1、ch340 Vcc短接3v3 5v---------5v GND-----GND TX ------RX RX --------TX 2、stm32F407 如上图&#xff0c;我们需要进入isp下载模式&#xff0c;接线图如下 二、下载 使用FlyMcu选择你要下载的程序文件中的.hex文件&#xff0c; 然后配置图如下&#xff1…

5月安全月报 | 钓鱼事件频发,OKLink带你开启“防钓”模式

本月全网安全事件所造成的损失环比上升 27.27%&#xff0c;钓鱼与诈骗事件占比 60% 以上。 安全意识是您保护数字资产的第一道防线&#xff0c;OKLink 提供 40 头部区块链浏览器与一站式查询入口以及地址监控、代币授权查询和地址健康度等工具&#xff0c;为您的资产安全保驾护…

使用CS抓取WIN2012明文密码

目录 实验概述&#xff1a; 开始实验&#xff1a; 实验准备&#xff1a; 打开CS&#xff1a; 生成木马控制wind2012&#xff1a; 抓取明文密码&#xff1a; 实验概述&#xff1a; win2012及win10版本是不允许将明文密码储存在内存中的&#xff0c;此时我们…

大量path计算优化方案

1.影响path基础属性数据做key缓存&#xff0c;缓存的path应去除坐标变换&#xff0c;归一化。基础属性应满足CAB, BC-A 2.高频path操作以&#xff08;keykey操作&#xff09;做新key缓存。 3.高频修改高级属性&#xff0c;以新key属性变更做新key缓存。 4.key与id做中转映射&am…

【每日刷题】Day52

【每日刷题】Day52 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2965. 找出缺失和重复的数字 - 力扣&#xff08;LeetCode&#xff09; 2. 350. 两个数组的交集 II …

C# FTP/SFTP 详解及连接 FTP/SFTP 方式示例汇总

文章目录 1、FTP/SFTP基础知识FTPSFTP 2、FTP连接示例3、SFTP连接示例4、总结 在软件开发中&#xff0c;文件传输是一个常见的需求。尤其是在不同的服务器之间传输文件时&#xff0c;FTP&#xff08;文件传输协议&#xff09;和SFTP&#xff08;安全文件传输协议&#xff09;成…

dolphinscheduler docker部署海豚mysql版本,docker重新封装正在运行服务为镜像

1.官方文档&#xff1a; https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/guide/installation/standalone#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93 2.github: dolphinscheduler/docs/docs/zh/guide/howto/datasource-setting.md at 3.2.1-release apache/do…

【R基础】如何开始学习R-从下载R及Rstudio开始

文章目录 概要下载R流程下载Rstudio流程下载完成-打开 概要 提示&#xff1a;如何开始学习R-从下载R及Rstudio开始&#xff0c;此处我只是想下载指定版本R4.3.3 下载R流程 链接: R官网 文件下载到本地 下载文件展示 按照向导指示安装 下载Rstudio流程 链接: Rstudio官网…

深度学习-语言模型

深度学习-语言模型 统计语言模型神经网络语言模型语言模型的应用序列模型&#xff08;Sequence Model&#xff09;语言模型&#xff08;Language Model&#xff09;序列模型和语言模型的区别 语言模型&#xff08;Language Model&#xff09;是自然语言处理&#xff08;NLP&…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月31日预测第7弹

昨天的3D已命中&#xff01;今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号。好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;7,6,5,8,9,3,2,0 十位&#xff1a;3,4,5,2,1,7,8,9 …

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头 2024/5/31 20:04 USB摄像头分辨率&#xff1a;1080p&#xff08;1920x1080&#xff09; 默认编译Buildroot的SDK即可点亮USB摄像头。v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video74 …

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 减少需要处…

【Linux】操作系统之冯诺依曼体系

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 操作系统中 冯诺依曼体系 的相关内容。 如果看到最后您觉得这篇文…

基于编译型语言鲲鹏应用开发小技巧

编译型语言应用执行过程 大部分应用可以通过重新编译即可移植到鲲鹏平台 预处理命令: gcc -E hello.c -o hello.i&#xff0c;预处理完成后使用命令: cat hello.i可以看到预处理后的代码 编译命令: gcc -s hello.i -o hello.s 汇编命令: gcc -c hello.c -o hello.o 链接处理…

接口测试之XML响应断言

目录 XPath 基本语法XML 响应结果解析XML 响应结果断言 XML 响应数据 如何提取 AddResult 中的值&#xff1f; <soap:Body><AddResponse xmlns"http://tempuri.org/"><AddResult>4</AddResult></AddResponse> </soap:Body> …

SpringBoot中MyBatisPlus的使用

MyBatis Plus 是 MyBatis 的增强工具&#xff0c;提供了许多强大的功能&#xff0c;简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤&#xff1a; 添加依赖&#xff1a;在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…

AI换脸FaceFusion一键云部署指南

大家好&#xff0c;从我开始分享到现在&#xff0c;收到很多朋友的反馈说配置很低玩不了AI。本篇是一个云端部署AI项目的指南&#xff0c;帮助大家在云端进行AI项目的部署。我会从云平台的选择、代码部署、保存镜像几个方面进行详细的介绍。没有代码基础的小白也不用担心&#…