solr服务配置及自行编译IKAnalyzer适应版本

配置solr服务,编译并启用适应当前版本的IKAnalyzer分词器。

作者 jooop 日期 2017-05-03
solr服务配置及自行编译IKAnalyzer适应版本

启动

DOS进入solr-6.5.1\bin目录下执行命令:
单机启动solr start
创建项目solr create_collection -c 项目名称
项目目录solr-6.5.1\server\solr

配置

配置文件solr-6.5.1\server\solr\know\conf下的solrconfig.xmlmanaged-schema

配置中文分词

修改managed-schema,在fieldfieldType标签后添加中文分词配置

<field name="question_title" type="text_ik" indexed="true" stored="true" multiValued="true"/>

后面找到相应位置,设置创建索引时不启用智能模式,搜索时启用智能模式。

<!--中文分词器配置-->
<fieldType name="text_ik" class="solr.TextField">
<!--索引时的分词器-->
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.util.IKTokenizerFactory" useSmart="false"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
<!--查询时的分词器-->
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.util.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>

编译IKAnalyzer

因为IKAnalyzer于12年停止更新,其中有部分方法在solr6.X下无正常工作,所以需要针对相应的lucene版本自行编译。

  • 下载IK Analyzer 2012FF_hf1_source.rar源码文件
  • 新建Maven工程groupId为org.wltea,将源码中的工程和配置文件复制到相应目录下。
  • 查看各个源码java文件,去maven官网找到缺少的相对应的lucene对应版本的依赖包。
    包括:
    Lucene Core
    Lucene Common Analyzers
    Lucene QueryParsers
  • 根据当前lucene版本修改过时的源文件的方法,以lucene6.5为例:

    • 去掉IKTokenizer.java中的super(in);和该方 法传入的Reader in参数。
    • 去掉IKAnalyzer.java中的final Reader inin参数。
    • 删除掉无用的query包和sample包。
    • 增加solr6.5中配置时需要的IKTokenizerFactory类继承自TokenizerFactory,实现如下:
      package org.wltea.analyzer.util;
      import org.apache.lucene.analysis.Tokenizer;
      import org.apache.lucene.analysis.util.TokenizerFactory;
      import org.apache.lucene.util.AttributeFactory;
      import org.wltea.analyzer.lucene.IKTokenizer;
      import java.util.Map;
      /**
      * Created by jooop on 2017-05-02.
      */
      public class IKTokenizerFactory extends TokenizerFactory {
      private boolean useSmart;
      public IKTokenizerFactory(Map<String, String> args) {
      super(args);
      useSmart = getBoolean(args,"useSmart",false);
      }
      public Tokenizer create(AttributeFactory attributeFactory) {
      Tokenizer tokenizer = new IKTokenizer(useSmart);
      return tokenizer;
      }
      }
  • 在pom.xml中加入打包时包括dic和xml的配置,最终pom.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.wltea</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>6.5.1</version>
    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->
    <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>${version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common -->
    <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers-common</artifactId>
    <version>${version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
    <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    <version>${version}</version>
    </dependency>
    </dependencies>
    <build>
    <resources>
    <resource>
    <directory>src/main/java</directory>
    <includes>
    <include>**/*.dic</include>
    </includes>
    </resource>
    <resource>
    <directory>src/main/resources</directory>
    <includes>
    <include>**/*.dic</include>
    <include>**/*.xml</include>
    </includes>
    </resource>
    </resources>
    </build>
    </project>
  • dos下进入项目目录使用maven命令打包mvn package完成编译。

引入jar包

solr目录下新建文件夹,目录如D:\solr-6.5.1\ext\ikanalyer,将上述过程编译好的jar包放入该目录。
修改前面提到的solrconfig.xml文件,在`<lib dir="………………"/>此处标签相应位置加入IK分词器的jar包目录:<lib dir="${solr.install.dir:../../../..}/ext/ikanalyer" regex=".*\.jar" />