最近看了看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毫秒
***************************************
准确率差好多
分享到:
相关推荐
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
本文将深入探讨Lucene中文分词器组件的相关知识点。 首先,我们要明白中文分词的重要性。由于中文是以词为基本单位,不像英文那样有明显的空格分隔,因此在进行信息检索时,需要先对中文文本进行分词,将连续的汉字...
Lucene是一个高性能、全文检索库,而“lucene中文分词工具包”则为Lucene提供了一个专门针对中文分词的解决方案。这个工具包的核心是IKAnalyzer,它是一个开源且基于Java语言开发的轻量级中文分词工具,旨在提升中文...
《Lucene中文分词器——Paoding解牛详解》 在中文信息检索领域,分词是至关重要的一环,它能够将连续的汉字序列切割成具有独立意义的词语,为后续的索引和查询提供基础。Lucene作为Java最著名的全文搜索引擎库,其...
中文分词是将连续的汉字序列切分成具有语义的词语的过程,是自然语言处理(NLP)中的基础步骤。在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备...
//采用正向最大匹配的中文分词算法,相当于分词粒度等于0 MMAnalyzer analyzer = new MMAnalyzer(); //参数为分词粒度:当字数等于或超过该参数,且能成词,该词就被切分出来 MMAnalyzer analyzer = new ...
《Lucene中文分词:庖丁解牛》 在信息技术高速发展的今天,全文搜索引擎已经成为网站内容检索不可或缺的一部分。其中,Apache Lucene作为一个开源的全文检索库,被广泛应用于各种项目中,尤其对于处理中文文本,...
关于lucene中文分词的一个辅助jar包
《深入理解Lucene中文分词源码:打造高效搜索引擎》 在信息爆炸的时代,搜索引擎已经成为了我们获取知识的重要工具。而构建一个强大的搜索引擎,离不开核心的文本处理技术——中文分词。Lucene作为一款高性能、全文...
《Lucene中文分词——庖丁解牛》 在自然语言处理领域,中文分词是基础且关键的一环。在Java开发中,Apache Lucene是一个强大的全文搜索引擎库,但默认并不支持中文,这就需要借助第三方分词工具。本文将深入探讨...
《深入理解Lucene中文分词公用组件V1.4》 Lucene,作为一个强大的全文搜索引擎库,对于中文处理尤其重要,而中文分词是其中的关键环节。本文将深入解析Lucene中文分词公用组件V1.4的更新内容,帮助开发者更好地理解...
本文将深入探讨“基于词典的最大匹配”的Lucene中文分词程序,这是构建高效、准确的中文信息处理系统的重要组成部分。 首先,我们要理解什么是分词。中文分词是指将连续的汉字序列按照词语的边界进行划分,使得每个...
标题中的“引入局部统计识别高频词汇的Lucene中文分词程序STUSegmentConfig.rar”表明这是一个基于Lucene的中文分词工具,它利用了局部统计信息来识别和处理中文文本中的高频词汇。Lucene是一个开源全文检索库,广泛...
标题中的“引入局部统计识别高频词汇的Lucene中文分词程序src.rar”表明这是一个关于使用Lucene进行中文分词的源代码项目,其中融入了局部统计的方法来识别和处理高频词汇。Lucene是一个流行的全文检索库,广泛应用...
### Struts标签Lucene中文分词构建 #### 概述 本文主要介绍如何利用Struts框架中的标签来实现中文分词的功能,特别是基于Lucene的分析器进行分词处理,并结合Log4j进行日志记录的技术实践。Struts作为Apache ...
《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和搜索引擎已经成为日常开发中不可或缺的部分。Lucene作为一款强大的全文检索库,被广泛应用于各种信息检索系统中。然而,对于中文...
IKAnalyzer2012+lucene中文分词是一个用于搜索引擎或信息检索系统的中文处理工具,它结合了IKAnalyzer2012和lucene-core-3.6.0这两个关键组件,为处理中文文本提供了高效的分词服务。在这个组合中,IKAnalyzer是主要...
1.修正了1.2版本在数量词处理的缺陷 2.优化分词性能 3.优化词典 请参考lucene中文分词公用组件V1.2之前版本使用说明
**Lucene 中文分词** Lucene 是一个开源的...总的来说,通过这个简单的Lucene中文分词案例,你可以了解到如何利用Lucene进行全文检索,并结合第三方分词器处理中文内容,从而在Java项目中实现高效的中文搜索功能。