`
gjs622520
  • 浏览: 41866 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

lucene中文分词

阅读更多
最近看了看lucene,看了一下那本《征服AJAX.LUCENE构建搜索引擎》,不能不说这本书有骗钱嫌疑,因为书中写了一大堆js跟ajax的内容,而似乎书中并没有结合ajax、lucene写出什么例子,当然书名取得好呀,如果拆开来看的话,就不能怪作者了,也就是说你相当于买了两本书,一本是《征服Ajax》,另一本是《LUCENE构建搜索引擎》,也可能这就是作者的本意吧,买一送一,作者好人也。
ajax部分没看,lucene部分还是花了工夫写的,只是版本有点过了,1.4,现在已经2.4,有些方法不见了,所以我只能下了三个版本的包1.4、1.9、2.4,2.4里找不到的去1.9里看是被什么替换了,这版本问题真是…………
CreateIndex.java
package test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.store.LockObtainFailedException;

public class CreateIndex {
	/**
	 * 建立索引
	 * @param indexPath 索引目录
	 * @param sourcePath 搜索目录
	 * @param fileSuffix 文件后缀
	 * @param recursive 是否递归子目录
	 * @param analyzer 分析器
	 */
	@SuppressWarnings("unchecked")
	public void createIndex(String indexPath,String sourcePath,String[] fileSuffix,boolean recursive,Class analyzer){
		try {
			Analyzer an=(Analyzer) analyzer.newInstance();
			IndexWriter writer=new IndexWriter(indexPath,an,true,MaxFieldLength.LIMITED);
			Collection<File> files=getFiles(sourcePath, fileSuffix, recursive);
			for (File file : files) {
				Reader reader = new FileReader(file);
				Document doc=new Document();
				doc.add(new Field("title",file.getName(),Field.Store.YES,Field.Index.ANALYZED));
				doc.add(new Field("content",reader));
				doc.add(new Field("path",file.getAbsolutePath(),Field.Store.YES,Field.Index.ANALYZED));
				writer.addDocument(doc);
				writer.optimize();				
			}
			writer.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取文件
	 * @param path 路径
	 * @param fileSuffix 后缀
	 * @param recursive 是否递归
	 * @return 文件集合
	 */
	@SuppressWarnings("unchecked")
	public Collection<File> getFiles(String path,String[] fileSuffix,boolean recursive){
		File src=new File(path);
		if(src.isDirectory()){
			return FileUtils.listFiles(src, fileSuffix, recursive);
		}
		return null;
	}
	
}



Searcher.java
package test;

import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocCollector;

public class Searcher {
	private Analyzer an;
	private IndexSearcher searcher;
	@SuppressWarnings("unchecked")
	public Searcher(Class analyzer,String indexPath){		
		try {
			an=(Analyzer) analyzer.newInstance();
			searcher=new IndexSearcher(IndexReader.open(new File(indexPath)));
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
	public ScoreDoc[] doSearch(String keyWord){
		QueryParser parser=new QueryParser("content",an);
		ScoreDoc[] hits=null;
		try {
			Query q=parser.parse(keyWord);
			 TopDocCollector collector = new TopDocCollector(10);
			 searcher.search(q, collector);
			 hits = collector.topDocs().scoreDocs;			
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return hits;
	}
	public void displayResult(ScoreDoc[] hits){		
		System.out.println("共找到"+hits.length+"个文件:");
		for(ScoreDoc hit : hits){
			try {
				int docId=hit.doc;
				System.out.println(searcher.doc(docId).getField("path").stringValue());
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}


public class App {
	public static void main(String[] args) {
		CreateIndex ci=new CreateIndex();
		ci.createIndex("D:/index", "D:/source", new String[]{"txt"}, true,MIK_CAnalyzer.class);
		Searcher s=new Searcher(MIK_CAnalyzer.class,"D:/index");		
		long start=System.currentTimeMillis();
		s.displayResult(s.doSearch("朱元璋 李寻欢"));
		System.out.println("查询  朱元璋 李寻欢  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("黄蓉"));
		System.out.println("查询  黄蓉  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("郭靖"));
		System.out.println("查询  郭靖  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("李寻欢"));
		System.out.println("查询  李寻欢  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("姚广孝"));
		System.out.println("查询  姚广孝  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
	}
}

结果:
共找到10个文件:
D:\source\古龙全集\多情剑客无情剑.txt
D:\source\明朝那些事\明朝那些事儿1朱元璋卷.txt
D:\source\古龙全集\飞刀,又见飞刀.txt
D:\source\古龙全集\古龙传奇.txt
D:\source\明朝那些事\明朝那些事儿2.txt
D:\source\古龙全集\大旗英雄传.txt
D:\source\古龙全集\天涯明月刀.txt
D:\source\古龙全集\怒剑狂花.txt
D:\source\明朝那些事\明朝那些事儿 4.txt
D:\source\明朝那些事\明朝那些事儿3.txt
查询  朱元璋 李寻欢  用了:1063毫秒
***************************************
共找到2个文件:
D:\source\金庸全集\神雕侠侣.txt
D:\source\金庸全集\倚天屠龙记.txt
查询  黄蓉  用了:0毫秒
***************************************
共找到4个文件:
D:\source\金庸全集\神雕侠侣.txt
D:\source\金庸全集\倚天屠龙记.txt
D:\source\金庸全集\射雕英雄传.txt
D:\source\古龙全集\古龙传奇.txt
查询  郭靖  用了:0毫秒
***************************************
共找到6个文件:
D:\source\古龙全集\多情剑客无情剑.txt
D:\source\古龙全集\飞刀,又见飞刀.txt
D:\source\古龙全集\古龙传奇.txt
D:\source\古龙全集\大旗英雄传.txt
D:\source\古龙全集\天涯明月刀.txt
D:\source\古龙全集\怒剑狂花.txt
查询  李寻欢  用了:0毫秒
***************************************
共找到1个文件:
D:\source\明朝那些事\明朝那些事儿2.txt
查询  姚广孝  用了:0毫秒
***************************************
射雕英雄传.txt里应该有黄蓉的可是没有搜到,虽然IKAnalyzer2.0.2已有很大改进。
改为使用lucene的StandardAnalyzer测试:
public class App {
	public static void main(String[] args) {
		CreateIndex ci=new CreateIndex();
		ci.createIndex("D:/index2", "D:/source", new String[]{"txt"}, true,StandardAnalyzer.class);
		Searcher s=new Searcher(StandardAnalyzer.class,"D:/index2");		
		long start=System.currentTimeMillis();
		s.displayResult(s.doSearch("朱元璋 李寻欢"));
		System.out.println("查询  朱元璋 李寻欢  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("黄蓉"));
		System.out.println("查询  黄蓉  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("郭靖"));
		System.out.println("查询  郭靖  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("李寻欢"));
		System.out.println("查询  李寻欢  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
		start=System.currentTimeMillis();
		s.displayResult(s.doSearch("姚广孝"));
		System.out.println("查询  姚广孝  用了:"+(System.currentTimeMillis()-start)+"毫秒");
		System.out.println("***************************************");
	}
}

结果:
共找到7个文件:
D:\source\明朝那些事\明朝那些事儿1朱元璋卷.txt
D:\source\明朝那些事\明朝那些事儿2.txt
D:\source\古龙全集\多情剑客无情剑.txt
D:\source\明朝那些事\明朝那些事儿3.txt
D:\source\古龙全集\飞刀,又见飞刀.txt
D:\source\古龙全集\大旗英雄传.txt
D:\source\古龙全集\怒剑狂花.txt
查询  朱元璋 李寻欢  用了:62毫秒
***************************************
共找到2个文件:
D:\source\金庸全集\倚天屠龙记.txt
D:\source\金庸全集\神雕侠侣.txt
查询  黄蓉  用了:0毫秒
***************************************
共找到2个文件:
D:\source\金庸全集\倚天屠龙记.txt
D:\source\金庸全集\神雕侠侣.txt
查询  郭靖  用了:16毫秒
***************************************
共找到4个文件:
D:\source\古龙全集\多情剑客无情剑.txt
D:\source\古龙全集\飞刀,又见飞刀.txt
D:\source\古龙全集\大旗英雄传.txt
D:\source\古龙全集\怒剑狂花.txt
查询  李寻欢  用了:0毫秒
***************************************
共找到1个文件:
D:\source\明朝那些事\明朝那些事儿2.txt
查询  姚广孝  用了:0毫秒
***************************************

准确率差好多

分享到:
评论
1 楼 lwlsoftware 2009-01-03  
Java基础不错  学习了

相关推荐

    Lucene中文分词器包

    来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...

    Lucene中文分词器组件

    本文将深入探讨Lucene中文分词器组件的相关知识点。 首先,我们要明白中文分词的重要性。由于中文是以词为基本单位,不像英文那样有明显的空格分隔,因此在进行信息检索时,需要先对中文文本进行分词,将连续的汉字...

    lucene中文分词工具包

    Lucene是一个高性能、全文检索库,而“lucene中文分词工具包”则为Lucene提供了一个专门针对中文分词的解决方案。这个工具包的核心是IKAnalyzer,它是一个开源且基于Java语言开发的轻量级中文分词工具,旨在提升中文...

    lucene中文分词器(paoding解牛)

    《Lucene中文分词器——Paoding解牛详解》 在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其...

    lucene.NET 中文分词

    中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备...

    Lucene中文分词组件 JE-Analysis 1.5.1

    //采用正向最大匹配的中文分词算法,相当于分词粒度等于0 MMAnalyzer analyzer = new MMAnalyzer(); //参数为分词粒度:当字数等于或超过该参数,且能成词,该词就被切分出来 MMAnalyzer analyzer = new ...

    lucene 中文分词 庖丁解牛

    《Lucene中文分词:庖丁解牛》 在信息技术高速发展的今天,全文搜索引擎已经成为网站内容检索不可或缺的一部分。其中,Apache Lucene作为一个开源的全文检索库,被广泛应用于各种项目中,尤其对于处理中文文本,...

    lucene中文分词jar包

    关于lucene中文分词的一个辅助jar包

    lucene中文分词源码,做搜索引擎需要用到的好东西哦

    《深入理解Lucene中文分词源码:打造高效搜索引擎》 在信息爆炸的时代,搜索引擎已经成为了我们获取知识的重要工具。而构建一个强大的搜索引擎,离不开核心的文本处理技术——中文分词。Lucene作为一款高性能、全文...

    lucene中文分词(庖丁解牛)庖丁分词

    《Lucene中文分词——庖丁解牛》 在自然语言处理领域,中文分词是基础且关键的一环。在Java开发中,Apache Lucene是一个强大的全文搜索引擎库,但默认并不支持中文,这就需要借助第三方分词工具。本文将深入探讨...

    lucene中文分词公用组件V1.4

    《深入理解Lucene中文分词公用组件V1.4》 Lucene,作为一个强大的全文搜索引擎库,对于中文处理尤其重要,而中文分词是其中的关键环节。本文将深入解析Lucene中文分词公用组件V1.4的更新内容,帮助开发者更好地理解...

    基于词典的最大匹配的Lucene中文分词程序

    本文将深入探讨“基于词典的最大匹配”的Lucene中文分词程序,这是构建高效、准确的中文信息处理系统的重要组成部分。 首先,我们要理解什么是分词。中文分词是指将连续的汉字序列按照词语的边界进行划分,使得每个...

    引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar

    标题中的“引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar”表明这是一个基于Lucene的中文分词工具,它利用了局部统计信息来识别和处理中文文本中的高频词汇。Lucene是一个开源全文检索库,广泛...

    引入局部统计识别高频词汇的Lucene中文分词程序src.rar

    标题中的“引入局部统计识别高频词汇的Lucene中文分词程序src.rar”表明这是一个关于使用Lucene进行中文分词的源代码项目,其中融入了局部统计的方法来识别和处理高频词汇。Lucene是一个流行的全文检索库,广泛应用...

    Struts标签Lucene中文分词构建

    ### Struts标签Lucene中文分词构建 #### 概述 本文主要介绍如何利用Struts框架中的标签来实现中文分词的功能,特别是基于Lucene的分析器进行分词处理,并结合Log4j进行日志记录的技术实践。Struts作为Apache ...

    lucene3庖丁解牛中文分词器

    《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和搜索引擎已经成为日常开发中不可或缺的部分。Lucene作为一款强大的全文检索库,被广泛应用于各种信息检索系统中。然而,对于中文...

    IKAnalyzer2012+lucene中文分词

    IKAnalyzer2012+lucene中文分词是一个用于搜索引擎或信息检索系统的中文处理工具,它结合了IKAnalyzer2012和lucene-core-3.6.0这两个关键组件,为处理中文文本提供了高效的分词服务。在这个组合中,IKAnalyzer是主要...

    lucene中文分词公用组件V1.3

    1.修正了1.2版本在数量词处理的缺陷 2.优化分词性能 3.优化词典 请参考lucene中文分词公用组件V1.2之前版本使用说明

    lucene 中文分词

    **Lucene 中文分词** Lucene 是一个开源的...总的来说,通过这个简单的Lucene中文分词案例,你可以了解到如何利用Lucene进行全文检索,并结合第三方分词器处理中文内容,从而在Java项目中实现高效的中文搜索功能。

Global site tag (gtag.js) - Google Analytics