[lucene]04.SmartChineseAnalyzer中文分词的使用

 修改上篇文章中创建索引的代码为如下:

package cn.zhao.cms.column;

import java.io.File;
import java.nio.file.Paths;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class TestLucene {
	public static void main(String[] args) throws Exception{
          //指定存放lucene生成的索引的目录,可以把这个目录看做一张表,lucene的所有索引都存放在这个表中
	    Directory directory = FSDirectory.open(Paths.get("D:\\lucene\\index"));
	    //使用默认的英文分词器
	    //	    Analyzer analyzer=new StandardAnalyzer();
	    //使用中文分词器
	    SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer();
	    IndexWriterConfig conf=new IndexWriterConfig(analyzer);
	    IndexWriter iwriter =new IndexWriter(directory, conf);
	    //每次创建先删除原来的已经生成的索引
		   iwriter.deleteAll();
		   //deleteAll只是放进了lucene索引回收站,这里还要从回收站也删除掉
		    iwriter.forceMergeDeletes();
	    
	    //生成这个文件的索引,当然,真实的情况会有很多目录以及很多文件,这里我们举例只拿一个文件来说事
	    File file=new File("D:\\lucene\\data\\tomcat如何配置根目录访问.html");
    	//Document可以看做表的一条记录,记录自然有多个field,可以看做表里的字段
    	//field在lucene里叫域,一个域有n(>=1)个terms,这个terms没法类比关系型数据库里面的概念了,
    	//你可以理解每个字段的内容按一定的切分规则(分词器)切分成了若干单元,每个单元就叫做term
    	Document document=new Document();
    	document.add(new StringField("id", 0+"", Field.Store.YES));
    	document.add(new StringField("docurl", file.getAbsolutePath(), Field.Store.YES));
    	TextField textField = new TextField("content", FileUtils.readFileToString(file), Field.Store.NO);
    	document.add(textField);
    	//按指定的分词规则analyzer写入存放索引的目录D:\\lucene\\index
    	iwriter.addDocument(document);
    	System.out.println("实际索引多少个文档:"+iwriter.numDocs());	    
	    System.out.println("最大索引多少个文档:"+iwriter.maxDoc());	    
	    //最后记得关闭资源
	    iwriter.close();
	    directory.close();
	}
}

代码说明:

1.分词器引起的变化:

        这里我们的分词器由原来的StandardAnalyzer换成了支持中文的分词器SmartChineseAnalyzer,打开luke工具,发现同一个文档,信息却已经有所变化了:

image.png

可以看到,terms数由原来的707个变成了现在的743个,说明两种分词器有着不一样的规则。

2.iwriter.deleteAll();和iwriter.forceMergeDeletes();删除原先已经生成的索引,不然每次执行程序都会生成一次,我们去索引目录下看,发现每执行一次都会多一份同样的文件,只是序号不一样,所以要加上这两句删除语句:

image.png

3.我们看到这里的中文依然是乱码,同样只是luke这个工具的显示问题,暂时也没有找到解决办法,不过也只是这里的显示有问题,内部的分词是不受影响的。

        问题来了,StandardAnalyzer和SmartChineseAnalyzer的本质区别在哪里呢?且看下文分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值