Solr搜索引擎第六篇-Solr集成中文分词器IKAnalyzer

2024-02-25 08:08

本文主要是介绍Solr搜索引擎第六篇-Solr集成中文分词器IKAnalyzer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 第一步:新建java maven工程
  • 第二步:定义三个java类
  • 第三步:定义三个配置文件
  • 第四步:打包三个类为jar
  • 第五步:拷贝IKAnalyzer-lucene7.5.jar和ikanalyzer-2012_u6.jar
  • 第六步:拷贝配置文件
  • 第七步:定义新的FieldType
  • 测试

在 Lucene搜索引擎-分词器一篇中讲述到Lucene如何集成中文分词器IKAnalyzer,这里Solr集成中文分词器IKAnalyzer是在此基础之上的,这里的solr版本为7.5。

第一步:新建java maven工程

pom.xml引入中文分词器IKAnalyzer

<!-- ikanalyzer 中文分词器  -->
<dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version><exclusions><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId></exclusion><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId></exclusion><exclusion><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId></exclusion></exclusions>
</dependency>

第二步:定义三个java类

IKAnalyzer4Lucene7:

package com.dalomao.framework.lucene.analizer.ik;import org.apache.lucene.analysis.Analyzer;public class IKAnalyzer4Lucene7 extends Analyzer {private boolean useSmart = false;public IKAnalyzer4Lucene7() {this(false);}public IKAnalyzer4Lucene7(boolean useSmart) {super();this.useSmart = useSmart;}public boolean isUseSmart() {return useSmart;}public void setUseSmart(boolean useSmart) {this.useSmart = useSmart;}@Overrideprotected TokenStreamComponents createComponents(String fieldName) {IKTokenizer4Lucene7 tk = new IKTokenizer4Lucene7(this.useSmart);return new TokenStreamComponents(tk);}}

IKTokenizer4Lucene7:

package com.dalomao.framework.lucene.analizer.ik;import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;import java.io.IOException;public class IKTokenizer4Lucene7 extends Tokenizer {// IK分词器实现private IKSegmenter _IKImplement;// 词元文本属性private final CharTermAttribute termAtt;// 词元位移属性private final OffsetAttribute offsetAtt;// 词元分类属性(该属性分类参考org.wltea.analyzer.core.Lexeme中的分类常量)private final TypeAttribute typeAtt;// 记录最后一个词元的结束位置private int endPosition;/*** @param* @param useSmart*/public IKTokenizer4Lucene7(boolean useSmart) {super();offsetAtt = addAttribute(OffsetAttribute.class);termAtt = addAttribute(CharTermAttribute.class);typeAtt = addAttribute(TypeAttribute.class);_IKImplement = new IKSegmenter(input, useSmart);}/** (non-Javadoc)* * @see org.apache.lucene.analysis.TokenStream#incrementToken()*/@Overridepublic boolean incrementToken() throws IOException {// 清除所有的词元属性clearAttributes();Lexeme nextLexeme = _IKImplement.next();if (nextLexeme != null) {// 将Lexeme转成Attributes// 设置词元文本termAtt.append(nextLexeme.getLexemeText());// 设置词元长度termAtt.setLength(nextLexeme.getLength());// 设置词元位移offsetAtt.setOffset(nextLexeme.getBeginPosition(),nextLexeme.getEndPosition());// 记录分词的最后位置endPosition = nextLexeme.getEndPosition();// 记录词元分类typeAtt.setType(nextLexeme.getLexemeTypeString());// 返会true告知还有下个词元return true;}// 返会false告知词元输出完毕return false;}/** (non-Javadoc)* * @see org.apache.lucene.analysis.Tokenizer#reset(java.io.Reader)*/@Overridepublic void reset() throws IOException {super.reset();_IKImplement.reset(input);}@Overridepublic final void end() {// set final offsetint finalOffset = correctOffset(this.endPosition);offsetAtt.setOffset(finalOffset, finalOffset);}
}

IKTokenizer4Lucene7Factory:

package com.dalomao.framework.lucene.analizer.ik;import java.util.Map;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.util.AttributeFactory;public class IKTokenizer4Lucene7Factory extends TokenizerFactory
{private boolean useSmart = false;public IKTokenizer4Lucene7Factory(Map<String, String> args) {super(args);String useSmartParm = (String)args.get("useSmart");if ("true".equalsIgnoreCase(useSmartParm))this.useSmart = true;}public Tokenizer create(AttributeFactory factory){return new IKTokenizer4Lucene7(this.useSmart);}
}

第三步:定义三个配置文件

扩展词:lucene_ext.dic

厉害了我的国

停用词:lucene_ext_stopword.dic

,
?
、
我
的
你

IK配置文件: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">lucene_ext.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">lucene_ext_stopword.dic</entry>
</properties>

第四步:打包三个类为jar

将前面定义的三个类达成jar包,命名为IKAnalyzer-lucene7.5.jar。
备注:具体如何打包请参看IntelliJ IDEA单独对java类打JAR包

第五步:拷贝IKAnalyzer-lucene7.5.jar和ikanalyzer-2012_u6.jar

将这个IKAnalyzer-lucene7.5.jar和 IKAnalyzer的jar(ikanalyzer-2012_u6.jar)拷贝到solr的web应用的lib目录下(solr-7.5.0/server/solr-webapp/webapp/WEB-INF/lib)

第六步:拷贝配置文件

将之前定义的三个配置文件拷贝到solr安装目录的应用classes目录下( solr-7.3.0/server/solr-webapp/webapp/WEB-INF/classes),如果没有classes目录则需要新建

第七步:定义新的FieldType

在内核主目录下conf/managed-schema.xml文件中定义一个新的FieldType,如下:

<fieldType name="zh_CN_text" class="solr.TextField"><analyzer><tokenizer class="com.dalomao.framework.lucene.analizer.ik.IKTokenizer4Lucene7Factory" useSmart="true" /> </analyzer>
</fieldType>

测试

以上全部步骤做完以后,重启Solr服务器实例,然后登陆web测试
在这里插入图片描述
测试成功!

这篇关于Solr搜索引擎第六篇-Solr集成中文分词器IKAnalyzer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744873

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr