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

news2024/10/7 2:28:06

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);

    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机站怎么推广

随着手机的普及和移动互联网的快速发展&#xff0c;越来越多的人开始使用手机进行在线购物、社交娱乐、阅读资讯等&#xff0c;同时也催生了越来越多的手机站的出现。但是&#xff0c;在海量的手机站中&#xff0c;要让自己的手机站脱颖而出&#xff0c;吸引更多用户访问和使用…

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸&#xff08;NMN&#xff09;功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸&#xff08;β-Nicotinamide mononucleotide&#xff0c;NMN&#xff09;是一种生物活性分子&#xff0c;是一种辅酶Ⅰ&#xff08;NAD&#xff09;的前体&#xff0c;也是…

Python魔法之旅-魔法方法(04)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Idea的相关操作

1、关闭自动更新 点击左上角File->Setting&#xff0c;进入配置页面&#xff0c;点击Appearance & Behavior > System Settings > Updates&#xff0c;取消勾选更新选项&#xff0c;如图&#xff1b; 2、代码提示忽略大小写 点击左上角File->Setting&#xf…

Llama 3-V: 比GPT4-V小100倍的SOTA

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

【目标检测】基于深度学习的植物中草药智能识别系统【python源码+Pyqt5界面+数据集+训练代码 MX_001期】

系统简介&#xff1a; 这是一款基于深度学习技术的植物草药智能识别系统。系统通过分析植物草药的图像&#xff0c;能够准确地识别出不同种类的草药&#xff0c;并提供相关的信息和用途。用户只需将植物草药的图像上传至系统&#xff0c;即可快速获得识别结果。 系统利用先进…

海关接口源码:跨境贸易的数字桥梁

在全球化贸易日益频繁的今天&#xff0c;海关接口源码成为了促进国际贸易的关键技术之一。它不仅提高了通关效率&#xff0c;还确保了贸易数据的准确性和安全性。本文将探讨海关接口源码的重要性、功能以及其在现代贸易中的作用。 一、海关接口源码的重要性 海关接口源码是一…

C语言分支和循环(2)

我的相关博客&#xff1a; C语言的分支与循环&#xff08;1&#xff09; 1.switch语句 除了 if 语句外&#xff0c;C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 的 if...else 结构&#xff0c;⽤于判断条件有多个结果的情况。它把多重 else if…

大模型高级 RAG 检索策略:自动合并检索

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

C++结构体数组struct和使用sizeof 从结构体数组中取出数据并写入数字功放寄存器编程实例

C结构体数组编程实例 C结构体数组与普通数组的不同之处&#xff1a;用至少1个花括号来分隔数组。 C结构体数组定义 C结构体数组的定义和定义结构体变量的方法类似&#xff0c;struct声明其为数组即可 结构体数组实例1&#xff1a; typedef struct {u8 cmd; //定义数组中的…

【MyBatis】MyBatis操作数据库(一)

目录 MyBatis的基础定义MyBatis配置相关文件一、注解操作数据库1.1 Insert(插入注解)1.2 Delete(删除注解)1.3 Update(修改注解)1.4 Select(重点&#xff1a;查询注解)注解解决查询不匹配问题拓展&#xff1a;Param(重命名注解)和OPtions(自增注解) 二、 XML操作数据库2.1 xml实…

迷你主机Esxi 6.7挂载新硬盘

背景 硬件&#xff1a;零刻SER Pro 6 系统&#xff1a;vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了&#xff0c;但空间不够用&#xff0c;想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…

Unity2D横版摄像机跟随

在Unity2D横版游戏中&#xff0c;摄像机跟随是一个非常重要的功能。一个流畅的摄像机跟随系统可以让玩家更好地沉浸在游戏世界中。本文将介绍如何在Unity中实现2D横版摄像机跟随&#xff0c;并分享一些优化技巧。 一、准备工作 在开始实现摄像机跟随之前&#xff0c;请确保您…

分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法

不废话&#xff0c;直接上正文。_ 方法一 思路&#xff1a;利用 BodyReader 直接读取 HttpContext 的 Request Body&#xff0c;再反序列化 var reqStream context.Request.BodyReader.AsStream(); var jsonObj JsonSerializer.Deserialize<CheckAndParsingMiddlewareM…

宏集JMobile Studio—实现HMI界面高自由度设计

一、简介 物联网HMI的组态软件是数据可视化的重要工具&#xff0c;工程师可以通过图形化界面来配置、监控和管理现场采集的数据。目前&#xff0c;市面上大多数的组态软件里的可视化控件库都由设计师预先部署&#xff0c;用户只能调用而不能完全自定义控件&#xff0c;导致可视…

万界星空科技MES系统功能介绍

制造执行系统或MES 是一个全面的动态软件系统&#xff0c;用于监视、跟踪、记录和控制从原材料到成品的制造过程。MES在企业资源规划(ERP) 和过程控制系统之间提供了一个功能层&#xff0c;为决策者提供了提高车间效率和优化生产所需的数据。 万界星空科技MES 系统基础功能&am…

OpenCv之简单的人脸识别项目(登录页面)

人脸识别 一、项目准备二、登录页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.运行脚本3.1定义识别脚本3.2定义提取脚本3.3定义标注脚本3.4定义人脸比对脚本3.5定义动态处理脚本3.6定义属性判断脚本 4.创建一个退出…

HTML跳动的爱心

目录 写在前面 HTML简介 跳动的爱心 代码分析 运行结果

eclipse-向Console控制台输出信息

首先这里主要用到的是org.eclipse.ui.console这个包&#xff0c;所以现在顺道先来了解一下&#xff1a; org.eclipse.ui.console是一个可扩展的console视图插件&#xff0c;利用它可以实现各种console&#xff0c;并把它们显示出来。该插件本身就实现了一个Message Console&…

2024瑜伽馆玩赚抖音,打造O2O线上线下超级门店

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89360427 更多资源下载&#xff1a;关注我。 课程介绍&#xff1a; 通过学习可以学会同城引流实操&#xff0c;通过线上放大实体门店盈利能力。清晰了解同城账号短视频的正确内容生产方向&#xff0c;并…