solr4.8 + tomcat8.5.9 + ansj_seg的整合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liujun_for_java/article/details/80514226

公司要求用ansj分词替换掉原始的IK分词,不过ansg的分词确实好用

ansj的github地址:https://github.com/NLPchina/ansj_seg

今天搞了一下午终于是基本搞定,刚开始学习solr有许多不会的地方,刚开始尝试用的高版本的solr7,关于整合ansj_seg的参考资料当中没有高版本的solr(^.^自己太菜),只有将solr版本的降为4.8的版本(公司用的也是4.x的版本),正好符合的公司的要求:我们要的是稳定版本(大笑)!

一.tomcat整合solr

1.tomcat的下载就不说了

solr历史版本的地址:http://archive.apache.org/dist/lucene/solr/


2.在tomcat的webapps下新建两个文件夹solr和solr_home

solr用于solr的客户端运行的程序

solr_home当做solr的数据存放地

解压solr


将example文件夹中的webapps下solr.war文件解压,将解压出来的文件直接剪切到tomcat的webapps中的solr文件夹里

扫描二维码关注公众号,回复: 4252554 查看本文章

(千万不要讲solr.war也放过去,不然程序运行会解压覆盖掉的)

将example/lib/ext中的五个jar包移动到刚才的webapps/solr/WEB-INF/lib文件夹下面


将example文件夹中的solr文件夹下的文件复制到tomcat的webapps下的solr_home当中


3.修改tomcat中刚移过来的配置文件

solr文件夹下的修改

修改WEB-INF下的web.xml

建议原先的信息保留,直接粘贴出来配置自己的solr_home路径


此时solr和tomcat的整合基本已经完成,大家启动tomcat可以访问solr的主页

访问地址:localhost/solr(我本地是将tomcat的端口改问了80),大家根据自己的端口去访问


看到这个图说明你已经完成了一个小目标

二.ansj_seg的整合(敲黑板,这里是重点要考的)

1. 准备需要4个jar包

ansj_seg-5.1.6.jar

nlp-lang-1.7.7.jar

ansg_lucene4_plug-5.0.2.jar

AnsjTokenizerFactory.jar(这个包是重点)

前三个jar包我们可以去maven库中去下载地址:http://mvnrepository.com(版本最好不要错,不然会出幺蛾子)


第四个jar包得由我们自己的程序生成,在eclipse中新建一个普通工程,添加依赖的jar包,如下


圈起来的三个我们已经下载了,其他的几个可以在我们的tomcat的solr中的lib文件夹下找到,不信你找找看

工程目录结构,普通工程就可以,这个AnsjTokenizerFactory就是我们要用的jar包


代码:

package com.***.AnsjTokenizerFactory;


import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.io.Reader;  
import java.util.HashSet;  
import java.util.Map;  
import java.util.Set;  

import org.ansj.lucene.util.AnsjTokenizer;  
import org.ansj.splitWord.analysis.IndexAnalysis;  
import org.ansj.splitWord.analysis.ToAnalysis;  
import org.apache.lucene.analysis.Tokenizer;  
import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.util.AttributeSource.AttributeFactory;  
//import org.apache.lucene.util.AttributeFactory;  

public class AnsjTokenizerFactory extends TokenizerFactory{  
  private boolean pstemming;  
  private boolean isQuery;  
  private String stopwordsDir;  
  public Set<String> filter;    

  public AnsjTokenizerFactory(Map<String, String> args) {  
      super(args);  
      assureMatchVersion();  
      isQuery = getBoolean(args, "isQuery", true);  
      pstemming = getBoolean(args, "pstemming", false);  
      stopwordsDir = get(args,"words");  
      addStopwords(stopwordsDir);  
  }  
  //add stopwords list to filter  
  private void addStopwords(String dir) {  
      if (dir == null){  
          System.out.println("no stopwords dir");  
          return;  
      }  
      //read stoplist  
      System.out.println("stopwords: " + dir);  
      filter = new HashSet<String>();  
      File file = new File(dir);   
      InputStreamReader reader;  
      try {  
          reader = new InputStreamReader(new FileInputStream(file),"UTF-8");  
          BufferedReader br = new BufferedReader(reader);   
          String word = br.readLine();    
          while (word != null) {  
              filter.add(word);  
              word = br.readLine();   
          }    
      } catch (FileNotFoundException e) {  
          System.out.println("No stopword file found");  
      } catch (IOException e) {  
          System.out.println("stopword file io exception");  
      }        
  }
	@Override
	public Tokenizer create(AttributeFactory arg0, Reader input) {
		// TODO Auto-generated method stub  
            if(isQuery == true){  
                //query  
                return new AnsjTokenizer(new ToAnalysis(new BufferedReader(input)), input, filter, pstemming);  
            } else {  
                //index  
                return new AnsjTokenizer(new IndexAnalysis(new BufferedReader(input)), input, filter, pstemming);  
            }  
	}  

}  
只要版本对只要粘贴复制就可以了( 自己折腾版本的时候一定要记得将Libraries中不用的版本清理干净)。

export导出jar包,记得导出的时候不要连带的将lib下依赖的jar包也导进去,标红的地方不要打勾选


这样第四个需要的jar包也有了

2.将这四个jar包放到tomcat里solr的lib文件夹下面
3.solr_home文件夹下的修改

修改collection1/conf/schema.xml文件


挑个自己喜欢的地方将分词方式引入

<!-- ansj -->
    <fieldType name="text_ansj" class="solr.TextField" positionIncrementGap="100">  
		<analyzer type="index">  
			 <tokenizer class="com.jyansj.AnsjTokenizerFactory.AnsjTokenizerFactory"  isQuery="false" pstemming="true"/>  
		</analyzer>  
	  
		<analyzer type="query">  
			<tokenizer class="com.jyansj.AnsjTokenizerFactory.AnsjTokenizerFactory" isQuery="false" pstemming="true"/>  
		</analyzer>  
    </fieldType>  
在pstemming属性的后面还可以添加停用词典的位置words="停用字典的路径"


4.引入ansj_seg的词典

在tomcat中solr项目文件夹下的WEB-INF中看有没有classes文件夹,没有的话新建,将ansj_seg的词典文件夹和properties文件移到classes文件夹中(这个ansj_seg-master是我从github上下载下来的,上面开始就给出了地址)



三.验收结果

重新启动tomcat

标红的地方是因为我没有配自己的停用词字典


页面查看结果


OK,我们都是中国人。

有问题的地方希望大家及时指出,我及时更正,不要让他人再踏坑!

参考博客:https://blog.csdn.net/allthesametome/article/details/46907197

猜你喜欢

转载自blog.csdn.net/liujun_for_java/article/details/80514226