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毫秒
***************************************
[b]射雕英雄传.txt里应该有黄蓉的可是没有搜到,虽然IKAnalyzer2.0.2已有很大改进。[/b]
改为使用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毫秒
***************************************

[b]准确率差好多[/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值