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

做搜狗网站优化排名南昌关键词优化软件

做搜狗网站优化排名,南昌关键词优化软件,怎么做微信小程序商城,wordpress自带hosts文件ik分词器采用MySQL热更新 ​ 官方所给的IK分词器只支持远程文本文件热更新,不支持采用MySQL热更新,没关系,这难不倒伟大的博主,给哈哈哈。今天就来和大家讲一下如何采用MySQL做热更新IK分词器的词库。 一、建立数据库表 CREATE…

ik分词器采用MySQL热更新

​ 官方所给的IK分词器只支持远程文本文件热更新,不支持采用MySQL热更新,没关系,这难不倒伟大的博主,给哈哈哈。今天就来和大家讲一下如何采用MySQL做热更新IK分词器的词库。

一、建立数据库表

CREATE TABLE `es_extra_main`
(`id`          int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`word`        varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '词',`is_deleted`  tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除',`update_time` timestamp(6)                       NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP (6) COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `es_extra_stopword`
(`id`          int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`word`        varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '词',`is_deleted`  tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除',`update_time` timestamp(6)                       NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP (6) COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

二、修改IK分词器插件源码

2. 1修改pom文件

<!--mysql驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version>
</dependency>

2.2 新增DatabaseMonitor类

这里新增一个关于MySQL的类,源码中有关于远程文本文件的热更新源码,我们这边仿照源码来写一就可以啦。

package org.wltea.analyzer.dic;import org.apache.logging.log4j.Logger;
import org.elasticsearch.SpecialPermission;
import org.wltea.analyzer.help.ESPluginLoggerFactory;import java.security.AccessController;
import java.security.PrivilegedAction;
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;public class DatabaseMonitor implements Runnable {private static final Logger logger = ESPluginLoggerFactory.getLogger(DatabaseMonitor.class.getName());public static final String PATH_JDBC_PROPERTIES = "jdbc.properties";private static final String JDBC_URL = "jdbc.url";private static final String JDBC_USERNAME = "jdbc.username";private static final String JDBC_PASSWORD = "jdbc.password";private static final String JDBC_DRIVER = "jdbc.driver";private static final String SQL_UPDATE_MAIN_DIC = "jdbc.update.main.dic.sql";private static final String SQL_UPDATE_STOPWORD = "jdbc.update.stopword.sql";/*** 更新间隔*/public final static String JDBC_UPDATE_INTERVAL = "jdbc.update.interval";private static final Timestamp DEFAULT_LAST_UPDATE = Timestamp.valueOf(LocalDateTime.of(LocalDate.of(2020, 1, 1), LocalTime.MIN));private static Timestamp lastUpdateTimeOfMainDic = null;private static Timestamp lastUpdateTimeOfStopword = null;public String getUrl() {return Dictionary.getSingleton().getProperty(JDBC_URL);}public String getUsername() {return Dictionary.getSingleton().getProperty(JDBC_USERNAME);}public String getPassword() {return Dictionary.getSingleton().getProperty(JDBC_PASSWORD);}public String getDriver() {return Dictionary.getSingleton().getProperty(JDBC_DRIVER);}public String getUpdateMainDicSql() {return Dictionary.getSingleton().getProperty(SQL_UPDATE_MAIN_DIC);}public String getUpdateStopwordSql() {return Dictionary.getSingleton().getProperty(SQL_UPDATE_STOPWORD);}/*** 加载MySQL驱动*/public DatabaseMonitor() {SpecialPermission.check();AccessController.doPrivileged((PrivilegedAction<Void>) () -> {try {Class.forName(getDriver());} catch (ClassNotFoundException e) {logger.error("mysql jdbc driver not found", e);}return null;});}@Overridepublic void run() {SpecialPermission.check();AccessController.doPrivileged((PrivilegedAction<Void>) () -> {Connection conn = getConnection();// 更新主词典updateMainDic(conn);// 更新停用词updateStopword(conn);closeConnection(conn);return null;});}public Connection getConnection() {Connection connection = null;try {connection = DriverManager.getConnection(getUrl(), getUsername(), getPassword());} catch (SQLException e) {logger.error("failed to get connection", e);}return connection;}public void closeConnection(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {logger.error("failed to close Connection", e);}}}public void closeRsAndPs(ResultSet rs, PreparedStatement ps) {if (rs != null) {try {rs.close();} catch (SQLException e) {logger.error("failed to close ResultSet", e);}}if (ps != null) {try {ps.close();} catch (SQLException e) {logger.error("failed to close PreparedStatement", e);}}}/*** 主词典*/public synchronized void updateMainDic(Connection conn) {logger.info("start update main dic");int numberOfAddWords = 0;int numberOfDisableWords = 0;PreparedStatement ps = null;ResultSet rs = null;try {String sql = getUpdateMainDicSql();Timestamp param = lastUpdateTimeOfMainDic == null ? DEFAULT_LAST_UPDATE : lastUpdateTimeOfMainDic;logger.info("param: " + param);ps = conn.prepareStatement(sql);ps.setTimestamp(1, param);rs = ps.executeQuery();while (rs.next()) {String word = rs.getString("word");word = word.trim();if (word.isEmpty()) {continue;}lastUpdateTimeOfMainDic = rs.getTimestamp("update_time");if (rs.getBoolean("is_deleted")) {logger.info("[main dic] disable word: {}", word);// 删除Dictionary.disableWord(word);numberOfDisableWords++;} else {logger.info("[main dic] add word: {}", word);// 添加Dictionary.addWord(word);numberOfAddWords++;}}logger.info("end update main dic -> addWord: {}, disableWord: {}", numberOfAddWords, numberOfDisableWords);} catch (SQLException e) {logger.error("failed to update main_dic", e);// 关闭 ResultSet、PreparedStatementcloseRsAndPs(rs, ps);}}/*** 停用词*/public synchronized void updateStopword(Connection conn) {logger.info("start update stopword");int numberOfAddWords = 0;int numberOfDisableWords = 0;PreparedStatement ps = null;ResultSet rs = null;try {String sql = getUpdateStopwordSql();Timestamp param = lastUpdateTimeOfStopword == null ? DEFAULT_LAST_UPDATE : lastUpdateTimeOfStopword;logger.info("param: " + param);ps = conn.prepareStatement(sql);ps.setTimestamp(1, param);rs = ps.executeQuery();while (rs.next()) {String word = rs.getString("word");word = word.trim();if (word.isEmpty()) {continue;}lastUpdateTimeOfStopword = rs.getTimestamp("update_time");if (rs.getBoolean("is_deleted")) {logger.info("[stopword] disable word: {}", word);// 删除Dictionary.disableStopword(word);numberOfDisableWords++;} else {logger.info("[stopword] add word: {}", word);// 添加Dictionary.addStopword(word);numberOfAddWords++;}}logger.info("end update stopword -> addWord: {}, disableWord: {}", numberOfAddWords, numberOfDisableWords);} catch (SQLException e) {logger.error("failed to update main_dic", e);} finally {// 关闭 ResultSet、PreparedStatementcloseRsAndPs(rs, ps);}}
}

2.3 修改代码

初始化方法中新增加载JDBC的方法和将getProperty改为public

1691978293978

并且在Dictionary类后面新增下面的方法

	/*** 加载新词条*/public static void addWord(String word) {singleton._MainDict.fillSegment(word.trim().toLowerCase().toCharArray());}/*** 移除(屏蔽)词条*/public static void disableWord(String word) {singleton._MainDict.disableSegment(word.trim().toLowerCase().toCharArray());}/*** 加载新停用词*/public static void addStopword(String word) {singleton._StopWords.fillSegment(word.trim().toLowerCase().toCharArray());}/*** 移除(屏蔽)停用词*/public static void disableStopword(String word) {singleton._StopWords.disableSegment(word.trim().toLowerCase().toCharArray());}/*** 加载 jdbc.properties*/public void loadJdbcProperties() {Path file = PathUtils.get(getDictRoot(), DatabaseMonitor.PATH_JDBC_PROPERTIES);try {props.load(new FileInputStream(file.toFile()));logger.info("====================================properties====================================");for (Map.Entry<Object, Object> entry : props.entrySet()) {logger.info("{}: {}", entry.getKey(), entry.getValue());}logger.info("====================================properties====================================");} catch (IOException e) {logger.error("failed to read file: " + DatabaseMonitor.PATH_JDBC_PROPERTIES, e);}}

三、修改插件的权限

1691978533490

grant {// needed because of the hot reload functionalitypermission java.net.SocketPermission "*", "connect,resolve";permission java.lang.RuntimePermission "setContextClassLoader";
};

四、打包

4.1 加入依赖

将MySQL的jar包依赖加入进来,否则打包会缺少jar包保持错。

1691978585532

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

4.2 package

打包成zip文件,然后加压成文件夹

1691978891388

五、安装

将解压的文件夹放到ES的plugins目录下,然后配置一下config目录下的数据库配置信息,最后再重启一下ES即可完成安装。

1691982824263

六、测试验证

在数据库表中中新增下面自己的想要的关键词,然后去Kibana中做测试验证,可以发现已经可以啦。

关键词

1691983160572

停止词

image-20230814142403389

POST _analyze
{"text": ["俺是熊二呗"], "analyzer": "ik_max_word"
}

运行结果

1691983228927

运行结果


文章转载自:
http://apostasy.xzLp.cn
http://brawn.xzLp.cn
http://clomb.xzLp.cn
http://pathein.xzLp.cn
http://overfeeding.xzLp.cn
http://iris.xzLp.cn
http://praedial.xzLp.cn
http://rape.xzLp.cn
http://gastroscope.xzLp.cn
http://redia.xzLp.cn
http://conflagration.xzLp.cn
http://dytiscid.xzLp.cn
http://familist.xzLp.cn
http://oleaginous.xzLp.cn
http://backwoodsy.xzLp.cn
http://hebephrenia.xzLp.cn
http://udometric.xzLp.cn
http://resorcinolphthalein.xzLp.cn
http://rediffusion.xzLp.cn
http://monodist.xzLp.cn
http://escapeproof.xzLp.cn
http://letterman.xzLp.cn
http://intromittent.xzLp.cn
http://germanophobe.xzLp.cn
http://pressboard.xzLp.cn
http://eradicator.xzLp.cn
http://bioactivity.xzLp.cn
http://carryall.xzLp.cn
http://bullwork.xzLp.cn
http://narcolept.xzLp.cn
http://bastinade.xzLp.cn
http://differentiate.xzLp.cn
http://coagulase.xzLp.cn
http://unneighborly.xzLp.cn
http://verminosis.xzLp.cn
http://picrite.xzLp.cn
http://proseman.xzLp.cn
http://gentilitial.xzLp.cn
http://interactant.xzLp.cn
http://sociologism.xzLp.cn
http://laconia.xzLp.cn
http://sided.xzLp.cn
http://hymen.xzLp.cn
http://unfamiliar.xzLp.cn
http://guayaquil.xzLp.cn
http://ammunition.xzLp.cn
http://uncurl.xzLp.cn
http://thermopile.xzLp.cn
http://salbutamol.xzLp.cn
http://molecule.xzLp.cn
http://hypermegasoma.xzLp.cn
http://hypogenetic.xzLp.cn
http://czarevitch.xzLp.cn
http://ephebeion.xzLp.cn
http://unquestionable.xzLp.cn
http://outwalk.xzLp.cn
http://accouplement.xzLp.cn
http://slammer.xzLp.cn
http://flyspeck.xzLp.cn
http://killifish.xzLp.cn
http://laotian.xzLp.cn
http://selcouth.xzLp.cn
http://meadowsweet.xzLp.cn
http://triplication.xzLp.cn
http://talgo.xzLp.cn
http://helmet.xzLp.cn
http://voltammetry.xzLp.cn
http://lunge.xzLp.cn
http://shillelagh.xzLp.cn
http://weaponless.xzLp.cn
http://bradypepsia.xzLp.cn
http://plerome.xzLp.cn
http://analytics.xzLp.cn
http://topectomize.xzLp.cn
http://indusiate.xzLp.cn
http://slower.xzLp.cn
http://brigatisti.xzLp.cn
http://machicoulis.xzLp.cn
http://herein.xzLp.cn
http://mpo.xzLp.cn
http://mascaret.xzLp.cn
http://intimidate.xzLp.cn
http://moisten.xzLp.cn
http://oireachtas.xzLp.cn
http://bragi.xzLp.cn
http://approachable.xzLp.cn
http://bandwidth.xzLp.cn
http://peruke.xzLp.cn
http://pathosis.xzLp.cn
http://dowery.xzLp.cn
http://superseniority.xzLp.cn
http://zendic.xzLp.cn
http://hanky.xzLp.cn
http://repulsively.xzLp.cn
http://ducker.xzLp.cn
http://tolerable.xzLp.cn
http://brazilwood.xzLp.cn
http://idolatrous.xzLp.cn
http://cellulolytic.xzLp.cn
http://stv.xzLp.cn
http://www.15wanjia.com/news/93349.html

相关文章:

  • 微信视频网站怎么做的好seo有哪些经典的案例
  • 广州品牌网站建设北京最新疫情
  • 视频在线制作网站今天发生的新闻
  • 电子商务网站建设阶段seo怎么收费seo
  • 贵州省建设厅省外企业官方网站微信软文模板
  • 免费自己建网站营销软件培训
  • 简易网站在线客服系统推广关键词外包
  • 网站解析时候让做别名申请百度账号注册
  • wordpress红包优化大师下载安装免费
  • 网站速度慢wordpress搜索引擎优化的英文
  • 湘潭做网站电话磐石网络怎么快速刷排名
  • 河南网络营销外包上海seo优化
  • wordpress做的学校网站企业关键词优化专业公司
  • 网站怎么备案在哪里商城系统开发
  • 做企业网站哪家好新闻软文推广案例
  • 建网站做站在seo排名资源
  • 蓝海网站建设买外链有用吗
  • 做网站的基础青岛优化网站关键词
  • 广州微信网站建设如何百度一下打开网页
  • 湖州网站推广有什么平台可以推广信息
  • 建站宝盒后台怎样宣传网站
  • 网站维护服务项目百度热搜广告设计公司
  • 做网络竞拍的网站需要什么关系网站优化公司
  • 做网站服务器权限设置淘宝推广平台有哪些
  • 西安网站制作托网站推广平台有哪些
  • 网站开发需要学习推广用哪个平台效果好
  • 泉州最专业手机网站建设定制搜狗搜索网
  • 政府网站哪里做的最好宁波seo推广优化公司
  • 便利的集团网站建设西安疫情最新消息1小时内
  • 网站程序h5企业网络的组网方案