Lucene-4.8.1+paoding-analysis菜鸟试验:中文索引和查询

庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。

Paoding's Knives 中文分词具有极 高效率 和 高扩展性 。

引入隐喻,采用完全的面向对象设计,构思先进。

高效率:在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字。

采用基于 不限制个数 的词典文件对文章进行有效切分,使能够将对词汇分类定义。

能够对未知的词汇进行合理解析。

缺点:官网:http://code.google.com/p/paoding/作者很早已不更新,跟不上Lucene的更新,可以找到支持Lucene4.8.*的Link: https://github.com/cslinmiso/paoding-analysis

一、下载Lucene(http://mirrors.cnnic.cn/apache/lucene/java/4.8.1/lucene-4.8.1.zip),下载后解压,Lucene所需要的基本jar文件如下列表:
     lucene-core-4.8.1.jar                   Lucene核心jar
     lucene-analyzers-4.8.1.jar            Lucene分词jar 
     lucene-highlighter-4.8.1.jar           Lucene高亮显示jar
 
二、由于Lucene中的中文分词实现不了我们所需要的功能,所以,需要下载第三方包(疱丁解牛)
     (1)下载支持Lucene4.8.*的Link: https://github.com/cslinmiso/paoding-analysis
     (2)修改pom.xml编译引用lib包lucene-4.8.1
    (3)mvn package
       (4)    找到Lucene使用'疱丁'所需要的jar文件如下列表:
    paoding-analysis.jar                       Lucene针对中文分词需要jar 
    commons-logging.jar                     日志文件
    {PADODING_HOME}/dic          疱丁解牛词典目录(PAODING_HOME:代表解压后的paoding目录)
 
三、打开Eclipse并创建一个Java Project(项目名称和项目所在的路径不能包含空格),本例中Project Name:Paoding
       1_1:在Paoding Project 创建一个Folder--lib(用于存放所有的jar),把前面所说的jar文件拷贝到lib目录下,并把lib下所有的jar添加到项目ClassPath下.   
      1_2:拷贝{PAODING_HOME}/dic目录 至   Paoding项目/src下整个项目结构图如下:
 
 
四、创建TestFileIndex.java类,实现功能是:把./data/*.txt所有文件读入内存中,并写入索引目录(./luceneindex)下
TestFileIndex.java
 
package com.wugang.paoding.index; 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class TestFileIndex { 
  public static void main(String[] args) throws Exception { 
    String dataDir="data"; 
    String indexDir="luceneindex"; 
     
    File[] files=new File(dataDir).listFiles(); 
    System.out.println(files.length); 
     
    Analyzer analyzer=new PaodingAnalyzer(); 
    Directory dir=FSDirectory.open(new File(indexDir)); 
    IndexWriter writer=new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_48,analyzer)); 
     
    for(int i=0;i<files.length;i++){ 
      StringBuffer strBuffer=new StringBuffer(); 
      String line=""; 
      FileInputStream is=new FileInputStream(files[i].getCanonicalPath()); 
      BufferedReader reader=new BufferedReader(new InputStreamReader(is,"utf8")); 
      line=reader.readLine(); 
      while(line != null){ 
        strBuffer.append(line); 
        strBuffer.append("\n"); 
        line=reader.readLine(); 
      } 
        
      Document doc=new Document(); 
      doc.add(new Field("fileName", files[i].getName(), Field.Store.YES, Field.Index.ANALYZED)); 
      doc.add(new Field("contents", strBuffer.toString(), Field.Store.YES, Field.Index.ANALYZED)); 
      writer.addDocument(doc); 
      reader.close(); 
      is.close(); 
    } 
     
    writer.commit(); 
    writer.close(); 
    dir.close(); 
    System.out.println("ok"); 
  } 
} 
 
五、创建TestFileSearcher.java,实现在的功能是:读取索引中的内容:
TestFileSearcerh.java
 
package com.wugang.paoding.index;

import java.io.File;
import java.io.StringReader;
import java.util.Set;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.AttributeImpl;

public class TestFileSearcher {
	public static void main(String[] args) throws Exception {
		String indexDir = "luceneindex";
		Analyzer analyzer = new PaodingAnalyzer();
		String search_text = "六小龄童的眼睛和耳朵变成小和尚";
		StringReader reader = new StringReader(search_text);
		TokenStream ts = analyzer.tokenStream(search_text, reader);
		boolean hasnext = ts.incrementToken();
		while (hasnext) {
			CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class);
			System.out.print(ta.toString() + " ");
			hasnext = ts.incrementToken();
		}
	    ts.close();
	    
		Directory dir = FSDirectory.open(new File(indexDir));
		DirectoryReader dr = DirectoryReader.open(dir);
		IndexSearcher searcher = new IndexSearcher(dr);
		QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",
				analyzer);		
		Query query = parser.parse(search_text);
		//Term term=new Term("contents", search_text);
		//TermQuery query=new TermQuery(term);
		System.out.println("\n"+ query.toString());		

		TopDocs docs = searcher.search(query, 1000);
		ScoreDoc[] hits = docs.scoreDocs;
		System.out.println(hits.length);
		for (int i = 0; i < hits.length; i++) {
			Document doc = searcher.doc(hits[i].doc);
			System.out.print(doc.get("fileName") + "--:\n");
			System.out.println(doc.get("contents") + "\n");
		}

		// searcher.close();
		dir.close();
	}
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值