java使用ik-analyzer 支持使用远程扩展词

文章主要是介绍,通过java方式分词,并且配置远程扩展词,实现程序热更新分词

1、下载com.github.magese:ik-analyzer 版本源代码
https://github.com/magese/ik-analyzer-solr.git

2、修改文件IKanalyzer.cfg.xml

新增远程词组属性
remote_ext_dict
remote_ext_stop_dict
对应地址填写自己远程地址

<?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">local.dic;</entry>
    <entry key="remote_ext_dict">http://ip:8080/ikanalyzer/ikanalyzer.txt</entry>
    <entry key="remote_ext_stop_dict">http://ip:8080/ikanalyzer/ikanalyzer_stop.txt</entry>
    <!--用户可以在这里配置自己的扩展停止词字典 -->
    <entry key="ext_stopwords">stop.dic;</entry>
</properties>

注意:
IKanalyzer.cfg.xml 此配置文件,可以配置到引用分词jar包的项目里;放到resources下即可

3、修改源代码
1)Configuration.java 新增接口

 List<String> getRemoteExtDictionarys();
 List<String> getRemoteExtStopDictionarys();

2)DefaultConfig.java 实现接口

 private static final String REMOTE_EXT_DICT = "remote_ext_dict";
 private static final String REMOTE_EXT_STOP_DICT = "remote_ext_stop_dict";

 @Override
  public List<String> getRemoteExtDictionarys() {
        List<String> extDictFiles = new ArrayList<>(2);
        String extDictCfg = props.getProperty(REMOTE_EXT_DICT);
        if (extDictCfg != null) {
            //使用;分割多个扩展字典配置
            String[] filePaths = extDictCfg.split(";");
            for (String filePath : filePaths) {
                if (filePath != null && !"".equals(filePath.trim())) {
                    extDictFiles.add(filePath.trim());
                }
            }
        }
        return extDictFiles;
    }

    @Override
    public List<String> getRemoteExtStopDictionarys() {
        List<String> extDictFiles = new ArrayList<>(2);
        String extDictCfg = props.getProperty(REMOTE_EXT_STOP_DICT);
        if (extDictCfg != null) {
            //使用;分割多个扩展字典配置
            String[] filePaths = extDictCfg.split(";");
            for (String filePath : filePaths) {
                if (filePath != null && !"".equals(filePath.trim())) {
                    extDictFiles.add(filePath.trim());
                }
            }
        }
        return extDictFiles;
    }

3)Dictionary.java 新增方法

//分别在两个地方调用以下两个方法


loadMainDict  方法最后调用  loadRemoteExtDict
Dictionary 构造函数中最后调用         
 //自定义加载远程停用扩展词
this.loadRemoteExtStopDict();


private void loadRemoteExtDict() {
        // 加载扩展词典配置
        List<String> extDictFiles = cfg.getRemoteExtDictionarys();
        if (extDictFiles != null) {
            InputStream is;
            for (String extDictName : extDictFiles) {
                // 读取扩展词典文件
                System.out.println("Load remote extended dictionary:" + extDictName);
                try {
                    is = new URL(extDictName).openStream();
                    // 如果找不到扩展的字典,则忽略
                    if (is == null) {
                        continue;
                    }
                    try {
                        readDict(is, _MainDict);
                    } catch (IOException ioe) {
                        System.err.println("Extension Dictionary loading exception.");
                        ioe.printStackTrace();

                    } finally {
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (IOException e) {
                    System.out.println("获取文件失败:" + extDictName);
                }
            }
        }
    }
private void loadRemoteExtStopDict() {
    // 加载扩展词典配置
    List<String> extDictFiles = cfg.getRemoteExtStopDictionarys();
    if (extDictFiles != null) {
        InputStream is;
        for (String extDictName : extDictFiles) {
            // 读取扩展词典文件
            System.out.println("Load remote stopwords dictionary:" + extDictName);
            try {
                is = new URL(extDictName).openStream();
                // 如果找不到扩展的字典,则忽略
                if (is == null) {
                    continue;
                }
                try {
                    readDict(is, _StopWordDict);
                } catch (IOException ioe) {
                    System.err.println("Extension Stop word Dictionary loading exception.");
                    ioe.printStackTrace();

                } finally {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                System.out.println("获取文件失败:" + extDictName);
            }
        }
    }
}

4、最后程序中调用

1)pom.xml引入

    <dependency>
            <groupId>com.github.magese</groupId>
            <artifactId>ik-analyzer</artifactId>
            <version>1.0.0</version>  这里版本更具自己下载的源码修改对应的版本
        </dependency>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值