elasticsearch 扩展词、停止词热更新方案 - 附代码

2023-10-29

最近要实现的一些功能需要让ES的扩展词、停用词能够热更新,达到让搜索更精确的目的。再此记录一下操作流程:

ES版本:7.11.2

IK分词器版本:7.11.2   

 

方式一:通过加载远程的方式热加载扩展词,停用词

分词器下载路劲:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.11.2

将下载的分词文件解压到 ~/elasticsearch/plugins/ik 目录,如果缺少相关目录进行创建 mkdir -p plugins/ik

[content@localhost ik]$ pwd
/home/content/elasticsearch-7.11.2/plugins/ik
[content@localhost ik]$ unzip elasticsearch-analysis-ik-7.11.2.zip
[content@localhost ik]$ rm -rf elasticsearch-analysis-ik-7.11.2.zip

进入ik 分词器的配置文件在容器中的路径:~/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

[content@localhost ik]$ cd config/
[content@localhost config]$ vim IKAnalyzer.cfg.xml 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
     <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">http://ip:port/ik/keyWord.txt</entry>
     <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">http://ip:port/ik/stopWord.txt</entry>
</properties>

nginx 目录新建一个 html 文件cd ~/nginx/html vim index.html hello world!

访问 nginx 服务,浏览器打印 hello world!。说明访问 nginx 服务的页面没有问题

创建 ik 分词词库文件 设置编码格式(set fileencoding=utf-8)

cd ~/nginx/html
mkdir ik
cd ik
vim keyWord.txt
vim stopWord.txt

填写 一些内容,并保存文件  然后访问 http://IP地址:端口号/ik/keyWord.txt 查看文档内容

重启 elasticsearch 服务;

 ps -ef | grep elastic 

 kill -9 [ pid ]

 sh elasticsearch -d

方式二:通过连接 MySQL 数据库热加载扩展词,停用词

下载 ik 分词器代码,链接 https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.11.2;下载解压后使用 idea 打开;

在 MySQL 数据库中创建 hot_words 表,stop_words 表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for hot_words
-- ----------------------------
DROP TABLE IF EXISTS `hot_words`;
CREATE TABLE `hot_words`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `keyword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `flag` int(255) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of hot_words
-- ----------------------------
INSERT INTO `hot_words` VALUES (1, '奥巴马', 0);
INSERT INTO `hot_words` VALUES (2, '悟空哥', 0);

SET FOREIGN_KEY_CHECKS = 1;


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for stop_words
-- ----------------------------
DROP TABLE IF EXISTS `stop_words`;
CREATE TABLE `stop_words`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `stopword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `flag` int(255) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of stop_words
-- ----------------------------
INSERT INTO `stop_words` VALUES (1, 'keyword', 0);
INSERT INTO `stop_words` VALUES (2, 'stopword', 0);
INSERT INTO `stop_words` VALUES (3, 'fielddata', 0);

SET FOREIGN_KEY_CHECKS = 1;

在config目录下添加jdbc.yml

jdbc:
  url: jdbc:mysql://172.16.***.***:3306/content?useUnicode=true&autoReconnect=true&failOverReadOnly=false&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
  user: root
  password : XXXX
  keywordSql: SELECT  keyword FROM hot_words WHERE flag=0
  stopWordSql: SELECT  stopword as stopWord FROM stop_words WHERE flag=0

在 pom 文件添加mysql maven库依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

修改 src\main\assemblies\plugin.xml 文件 添加如下内容:作用是在 maven 打包时,会把 mysql 驱动 jar 包打包到压缩文件中;

<include>mysql:mysql-connector-java</include>

找到 org.wltea.analyzer.dic.Dictionary 类 添加如下代码 

static {
		try {
			//利用反射把mysql驱动加载到内存
			Class.forName("com.mysql.jdbc.Driver").newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 从mysql加载热更新词典
	 */
	private void loadExpandKeyWordSql() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		ResultSet rstop = null;
		Properties prop = null;
		InputStream inputStream = null;
		try {
			prop = new Properties();
			inputStream  = new FileInputStream(PathUtils.get(getDictRoot(), "jdbc.yml").toFile());
			prop.load(inputStream);
			conn = DriverManager.getConnection(
					prop.getProperty("url"),
					prop.getProperty("user"),
					prop.getProperty("password"));
			stmt = conn.createStatement();
			rs = stmt.executeQuery(prop.getProperty("keywordSql"));

			while (rs.next()) {
				String keyword = rs.getString("keyword");
				_MainDict.fillSegment(keyword.trim().toCharArray());
			}
			logger.info("从mysql热加载 keyWord 成功!");

		} catch (Exception e) {
			logger.error("error", e);
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
		}
	}

	/**
	 *  mysql 加载停用词词典
	 */
	private void loadExpandStopWordSql() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		ResultSet rstop = null;
		Properties prop = null;
		InputStream inputStream = null;
		try {
			prop = new Properties();
			inputStream = new FileInputStream(PathUtils.get(getDictRoot(), "jdbc.yml").toFile());
			prop.load(inputStream);
			conn = DriverManager.getConnection(
					prop.getProperty("url"),
					prop.getProperty("user"),
					prop.getProperty("password"));
			stmt = conn.createStatement();

			rstop = stmt.executeQuery(prop.getProperty("stopWordSql"));
			while (rstop.next()) {
				String stopWord = rstop.getString("stopWord");
				_StopWords.fillSegment(stopWord.trim().toCharArray());
			}
			logger.info("从mysql热加载 stopWord 成功!");
		} catch (Exception e) {
			logger.error("error", e);
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (rs != null) {
				try {
					rstop.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
			if (stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
		}
	}

找到 org.wltea.analyzer.dic.Dictionary 类 initial() 方法 添加如下代码

/**
	 * 词典初始化 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化
	 * 只有当Dictionary类被实际调用时,才会开始载入词典, 这将延长首次分词操作的时间 该方法提供了一个在应用加载阶段就初始化字典的手段
	 *
	 * @return Dictionary
	 */
	public static synchronized void initial(Configuration cfg) {
		if (singleton == null) {
			synchronized (Dictionary.class) {
				if (singleton == null) {

					singleton = new Dictionary(cfg);
					singleton.loadMainDict();
					singleton.loadSurnameDict();
					singleton.loadQuantifierDict();
					singleton.loadSuffixDict();
					singleton.loadPrepDict();
					singleton.loadStopWordDict();

					if(cfg.isEnableRemoteDict()){
						// 建立监控线程
						for (String location : singleton.getRemoteExtDictionarys()) {
							// 10 秒是初始延迟可以修改的 60是间隔时间 单位秒
							pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);
						}
						for (String location : singleton.getRemoteExtStopWordDictionarys()) {
							pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);
						}
						/* 从 mysql 中热加载 keyWord 更新扩展词典 */
						pool.scheduleAtFixedRate(() -> {
							Dictionary.getSingleton().loadExpandKeyWordSql();
						}, 10, 120, TimeUnit.SECONDS);

						/* 从 mysql 中热加载 stopWord 更新扩展词典 */
						pool.scheduleAtFixedRate(() -> {
							Dictionary.getSingleton().loadExpandStopWordSql();
						}, 10, 120, TimeUnit.SECONDS);
					}

				}
			}
		}
	}

 找到 plugin-security.policy 文件

grant {
  // IP地址 和 端口号 填写 mysql 数据库IP 和端口
  permission java.net.SocketPermission "127.0.0.1:3306", "connect,resolve";
  permission java.lang.RuntimePermission "setContextClassLoader";
};

进入 pom.xml 文件 修改 分词器版本 和名称,我下载的是 7.11.2 版本分词器,但代码里面版本是 7.4.2,在此修改一下

修改org.elasticsearch.plugin.analysis.ik.AnalysisIkPlugin类

打包上传服务器解压即可,打包 命令 mvn clean package -Dmaven.skip.test=true,我本地命令打包一直失败,图形化打包可以!

打包完成后, target\releases 下面会生成一个 zip 压缩文件 上传服务器解压 ~/elasticsearch/plugins/ik-expand

[content@localhost ik-expand]$ pwd
/home/content/elasticsearch-7.11.2/plugins/ik-expand
[content@localhost ik-expand]$ unzip elasticsearch-analysis-ik-7.11.2.zip
[content@localhost ik-expand]$ rm -rf ./elasticsearch-analysis-ik-7.11.2.zip
[content@localhost ik-expand]$ ls
commons-codec-1.9.jar    config                                httpclient-4.5.2.jar  mysql-connector-java-8.0.21.jar  plugin-security.policy
commons-logging-1.2.jar  elasticsearch-analysis-ik-7.11.2.jar  httpcore-4.4.4.jar    plugin-descriptor.properties     protobuf-java-3.11.4.jar

重启 es 就完成了配置;

如果报错日志如下,说明 上述 plugin-security.policy 文件配置未生效;

在/home/es/policy.policy ,在policy.policy 写入与 plugin-security.policy 文件中相同的内容:


grant {
  // IP 和 端口号  与 MySQL 数据库保持一致
  permission java.net.SocketPermission "******:3306", "connect,resolve";
  permission java.lang.RuntimePermission "setContextClassLoader";
};

然后在 elasticsearch  config目录文件 jvm.option 添加该命令: -Djava.security.policy=/home/es/policy.policy

[content@localhost config]$ 
[content@localhost config]$ pwd
/home/content/elasticsearch-7.11.2/config
[content@localhost config]$ vim jvm.options

查看修改后分词器效果

原始分词器会把 奥巴马 特朗普 分割成不同字段:

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "奥巴马不顾特朗普反对外迁囚犯"
}

 分词结果:

{
  "tokens" : [
    {
      "token" : "奥",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "巴马",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "不顾",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "特",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "朗",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "CN_CHAR",
      "position" : 4
    },
    {
      "token" : "普",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "CN_CHAR",
      "position" : 5
    },
    {
      "token" : "反对",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "外迁",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "囚犯",
      "start_offset" : 12,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 8
    }
  ]
}

 自定义分词器不会把 奥巴马 特朗普 这些人名分割开:

POST _analyze
{
  "analyzer": "ik_smart_expand",
  "text": "奥巴马不顾特朗普反对外迁囚犯"
}

分词结果:

{
  "tokens" : [
    {
      "token" : "奥巴马",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "不顾",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "特朗普",
      "start_offset" : 5,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "反对",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "外迁",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "囚犯",
      "start_offset" : 12,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 5
    }
  ]
}

 

参考资料:

https://blog.csdn.net/qq_39140300/article/details/110382612

https://blog.csdn.net/zq199419951001/article/details/89884461

http://www.passjava.cn/#/02.PassJava%E6%9E%B6%E6%9E%84%E7%AF%87/14.Elasticsearch%E5%8E%9F%E7%90%86?id=_66-%e8%87%aa%e5%ae%9a%e4%b9%89%e5%88%86%e8%af%8d%e8%af%8d%e5%ba%93

代码:

https://gitee.com/gxd_feiyu/es_ik_expand/tree/master/elasticsearch-analysis-ik-7.11.2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elasticsearch 扩展词、停止词热更新方案 - 附代码 的相关文章

  • 【基于Docker-Compose安装ELK日志系统完整操作步骤】

    一 前言 ELK是三个开源软件的缩写 分别是Elasticsearch Logstash Kibana 一般情况下会结合FileBeat使用 Elasticsearch 是个开源分布式搜索引擎 它的特点有 分布式 零配置 自动发现 索引自动
  • docker-compose编排ELK,kibana报错Unable to revive connection: http://172.16.23.126:9200/

    问题描述 使用docker compose方式编排ELK环境 启动elasticsearch没有问题 浏览器访问内网es环境http 172 16 23 126 9200 cluster health pretty正常 但是kibana启动
  • ELK技术栈实践(一)

    通常 日志被分散的储存不同的设备上 如果你管理数十上百台服务器 你还在使用依次登录每台机器的传统方法查阅日志 这样是不是感觉很繁琐和效率低下 当务之急我们使用集中化的日志管理 例如 开源的syslog 将所有服务器上的日志收集汇总 集中化管
  • SpringBoot 接入 ELK - 动态索引详解

    1 说明 1 docker环境需要java maven环境 检查这两个 java version mvn version 2 本次ELK是使用docker运行的 ELK极其耗内存 服务器内存在4G及以内的 不建议安转 2 Linux mav
  • ELK 企业级日志分析系统 ELFK

    一 概述 ELK平台是一套完整的日志集中处理解决方案 将 ElasticSearch Logstash 和 Kiabana 三个开源工具配合使用 完成更强大的用户对日志的查询 排序 统计需求 使用ELK日志文件系统的原因 日志主要包括系统日
  • java编写es搜索程序

    开发环境 java8 springboot pom文件导入依赖
  • elasticsearch 编写java程序报错Exception in thread "main" java.lang.NoClassDefFoundError: org/elasticsearch

    java程序启动报错 Exception in thread main java lang NoClassDefFoundError org elasticsearch plugins NetworkPlugin ERROR StatusL
  • elasticsearch7.9 修改指定JDK

    错误 future versions of Elasticsearch will require Java 11 your Java version from usr local nlp java jdk1 8 0 162 jre does
  • ELK之Elasticsearch常用DSL语句(kibana语句)

    DSL 是什么 DSL Domain Specific Language 的缩写 中文翻译为领域特定语言 Wikipedia 对于 DSL 的定义还是比较简单的 A specialized computer language designe
  • ELK日志分析系统原理与部署

    文章目录 一 ELK日志分析系统简介 1 1ELK日志分析系统组成 1 2日志处理步骤 二 三款软件各自概念 2 1Elasticsearch介绍 2 2Logstash介绍 2 3Kibana介绍 三 ELK日志分析系统部署 3 1实验环
  • docker-compose deploy 高可用 elasticsearch TLS

    文章目录 1 sysctl 2 swap 3 hosts 4 配置 instances yaml 5 创建证书 6 部署 7 修改 kibanna 密码 8 清理 1 sysctl root github es tls cat etc sy
  • Es修改索引别名

    在使用ES时有时候我们需要修改索引信息 本文总结了如何修改索引信息 ES修改索引结构 在 ElasticSearch 中索引就类似于关系型数据库中 Table 的概念 如果要修改索引的一些关键信息时 要重建索引 具体步骤如下 新建索引 复制
  • elasticsearch部署过程中各种报错解析

    elasticsearch bootstrap StartupException java lang RuntimeException can not run elasticsearch as root ES不能能使用root用户直接运行
  • 分布式日志收集(ELK)

    ELK简介 ELK Elasticsearch Logstash Kibana 是同一家公司开发的3个开源工具 可组合起来搭建海量日志分析平台 目前很多公司都在使用这种方式搭建日志分析平台进行大数据分析 参考 初识ES数据库 Logstas
  • [分布式] zookeeper集群与kafka集群

    目录 一 Zookeeper 概述 1 1 Zookeeper定义 1 2 Zookeeper 工作机制 1 3 Zookeeper 特点 1 4 Zookeeper 数据结构 1 5 Zookeeper 应用场景 1 6 Zookeepe
  • 大数据笔记--ELK(第一篇)

    一 ELK介绍 1 什么是ELK ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案 是三个产品的首字母缩写 分别是ElasticSearch Logstash 和 Kibana 1 1 E ELASTICSEARCH
  • Beats — Filebeat 基础操作

    ElasticStack Beats 定义 一 ElasticStack 的组成 二 Beats 组件 FileBeat 日志采集 二 Filebeat 工作原理 三 启动命令 四 部署和运行 1 output console 通过终端获取
  • Elasticsearch 未分配分片 CircuitBreakingException[[parent] 数据太大

    我收到警报 指出 elasticsearch 有 2 个未分配的分片 我进行了以下 api 调用以收集更多详细信息 curl s http localhost 9200 cluster allocation explain python m
  • Logstash 的流行为不一致 - ELK

    我有一个包含几个平面字段和几个嵌套字段的索引 我正在尝试通过 Logstash 将 SQL Server 中的信息通过特定 ID 流式传输到嵌套字段中 当我流式传输数据时only one然后它就完全成功地通过了 没有任何问题 另一方面 当我
  • 超出elasticsearch中字段的最大长度 - kibana中的错误

    发现 prod logs 索引的 CSnZmwB xkQcDCOrP1V 文档的 message 字段的长度已超过 1000000 允许分析突出显示的最大值 可以通过更改 index highlight max analyzed offse

随机推荐

  • WDK李宏毅学习笔记第二十周01_Deep Reinforcemen Learning

    Deep Reinforcemen Learning 文章目录 Deep Reinforcemen Learning 摘要 1 Reinforcemen Learning RL 是什么 1 1 RL的做法 1 1 1 Function wi
  • 6.4 PyTorch实现Skipgram模型

    欢迎订阅本专栏 PyTorch深度学习实践 订阅地址 https blog csdn net sinat 33761963 category 9720080 html 第二章 认识Tensor的类型 创建 存储 api等 打好Tensor的
  • [游戏更新]游戏更新框架的设计

    主要是通过文章来记录一下游戏更新流程的框架设计 资源打包 资源下载等 热更新的功能框架使用的是XLua 这里不做详细介绍 流程图 因为是海外游戏 考虑到GooglePlay对包体大小的限制 因此 会有一些资源做成压缩包 在特定时间进行下载
  • 学习grep(参数)选项

    grep一般格式为 grep 选项 基本正则表达式 文件 这里基本正则表达式可为字符串 1 1 双引号引用 在grep命令中输入字符串参数时 最好将其用双引号括起来 例如 m y s t r i n g 这样做有两个原因 一是以防被误解为s
  • 使用python时,ModuleNotFoundError: No module named ‘win32api‘处理方法

    方法一 亲测有效 直接 pip install pywin32 就行了 方法二 转载自https blog csdn net qq 41676500 article details 89282872 1 环境 win10 python3 7
  • Golang面试题(51-75)

    51 读写锁RWMutex的实现原理 概念 读写互斥锁是对Mutex的一个扩展 当一个Goroutine获得读锁后 其他Goroutine仍然可以获取读锁 当一个Goroutine获取写锁后 其他Goroutine不能获取读锁和写锁 使用场
  • Godot 4 源码分析 - 文件读入编码处理

    今天需要读入xml文件进行处理 结果读入一个带中文的文件时 出错了 当然程序还能运行 但编译器一直报错 而且XML解析也不正确 单步调试发现读入的内容出现乱码 具体逻辑 String FileAccess get as text bool
  • 剪贴板是计算机系统,剪贴板在哪里,手把手教你如何打开电脑剪贴板

    电脑上的剪切板对用户来说是非常重要工具 经常要用到它 复制或者移动的文件 都是先放在 剪贴板 里面 然后从这里面复制或者移动到指定的地方去 但是许多用户反映说不懂得 那么剪切板究竟该如何打开呢 下面 小编给大家讲解打开电脑剪贴板的技巧 作为
  • 软件项目的全生命周期

    就职于软件行业的人 无论是销售 售前 技术还是财务一定都会接触到关于项目运作相关的工作 不同职位的员工对于项目的关注点也大不相同 财务人员关注项目的收款节点 销售人员关注项目的商务关系及前期引导 实施人员关注项目的实施过程等等 这就造成各个
  • 递归查询与迭代查询实例说明

    转载请注明来源 作者 loongshawn http blog csdn net loongshawn article details 55261897 建议读者阅读原文 确保获得完整的信息 1 定义说明 熟悉几个概念 循环 loop 最基
  • 双目线扫描结构光三维重建立体视觉-OpenCV+PCL点云+MFC

    视频 双目线扫描结构光三维重建立体视觉 OpenCV PCL点云 目录 基础知识 双目标定 双目矫正 双目匹配 线激光提取 三维点坐标提取 MFC介绍 OpenCV嵌入MFC
  • java中BigDecimal类的几种舍入模式的详细介绍

    BigDecimal类提供了几种舍入模式 RoundingMode 用于在执行舍入操作时确定如何处理小数部分 下面是BigDecimal类中定义的几种常用舍入模式及其说明 RoundingMode UP 向正无穷方向舍入 即始终对非零舍弃部
  • LDA 用于将文档中的文本分类为特定主题

    数据集 LDA 用于将文档中的文本分类为特定主题 它构建每个文档模型的主题和每个主题模型的单词 建模为 Dirichlet 分布 每个文档被建模为主题的多项分布 每个主题被建模为单词的多项分布 LDA 假设我们输入的每一块文本都将包含某种相
  • sharding-jdbc01-主从分离环境搭建

    一 完全卸载mysql 1 1 查看并删除mysql安装了的东西 rpm qa grep i mysql yum remove XXX 上面查到的结果 1 2 删除mysql相关目录 find name mysql rm rf XXX 上面
  • nginx修改配置后reload原理初探

    前言 nginx启动时 会启动两个进程 一个是Master进程和worker进程 改变配置后nginx做的事 1 改变了nginx配置之后 HUP signal的信号需要发送给主进程 2 主进程首先会检测新配置的语法有效性 3 尝试应用新的
  • php CI框架中调用接口 memcache缓存数据

  • 基于SSM+Layui的图书管理系统项目【1】部署运行

    目录 前言 项目界面 不感兴趣直接从一开始看 一 配置数据库 二 打开项目 三 配置 3 1配置自己的jdk1 8 3 2修改数据库配置 3 3配置Tomcat 四 运行 前言 gitee上发现一个非常优秀的ssm练手项目 达到毕设水准了
  • 什么是AIGC(AI Generated Content, 人工智能生成内容)?

    AI生成内容 AIGC 人工智能生成内容 是一种新型的内容创作方式 它继承了专业生产内容 PGC Professional generated Content 和用户生成内容 UGC User generated Content 的优点 并
  • Mybatis-Plus+SpringBoot结合运用

    目录 前言 一 创建Maven项目导入相关的依赖 二 在resources添加日志和连接数据库 1 日志文件 log4j properties 2 连接数据库 application properties 三 编写pojo 注解编写get
  • elasticsearch 扩展词、停止词热更新方案 - 附代码

    最近要实现的一些功能需要让ES的扩展词 停用词能够热更新 达到让搜索更精确的目的 再此记录一下操作流程 ES版本 7 11 2 IK分词器版本 7 11 2 方式一 通过加载远程的方式热加载扩展词 停用词 分词器下载路劲 https git