在手的项目需要用到lunece对系统做一个全文检索的扩展功能,组里没有人用过这个玩意,不知怎么就把这个任务发给我了。没办法网上查资料学习呗。
一 第一个索引实例
网上很多实例,找了一个照着写了一个程序运行看了下,代码如下
实例一
<pre name="code" class="java">package nis.com.mytest;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class LuceneTest {
public static void main(String[] args) throws IOException, ParseException {
FSDirectory directory = FSDirectory.open(new File(
"D:\\index"));
//RAMDirectory directory = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36,
new StandardAnalyzer(Version.LUCENE_36));
IndexWriter writer = new IndexWriter(directory, config);
Document doc = new Document();
doc.add(new Field("name", "历史表12", Field.Store.YES,
Field.Index.ANALYZED));
writer.addDocument(doc);
writer.close();
IndexReader reader = IndexReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
FuzzyQuery query = new FuzzyQuery(new Term("name", "历"));
TopDocs rs = searcher.search(query, null, 10);
System.out.println(rs.totalHits);
ScoreDoc[] docs = rs.scoreDocs;
for (int i = 0; i < docs.length; i++) {
Document docu = searcher.doc(docs[i].doc);
System.out.println(docu.get("name"));
}
}
}
运行后输出为
1
历史表12
初步理解代码,首先你需要一个目录来存放生成的索引文件 即 FSDirectory directory = FSDirectory.open(new File( "D:\\index")); ,然后就是生成索引的实现了 ,
需要用到IndexWriter类来实现索引文件的输出,生成索引的基本元素可以看成Document类,每个索引由多个doc组成(ps:有关doc和field在第二部分写出个人理解)。
然后就是读取索引文件进行检索,获取想要的结果。IndexReader类实现对索引文件加载读取的功能,将读取的内容放到IndexSearcher中封装成一个查询的
表(这里用表可能不对,个人感觉和数据库类似,斗胆使用)。FuzzyQuery可以看成是查询的语句,对表进行检索,返回结果集。
代码的大致功能如上所述。下面就对代码中的一些使用的类做一些解释,大部分来源于网络资源,自己收集了一下。
二 lunece创建及检索常用的类解释
Directory类(声明存放索引的位置)
个人使用过的有两个分别是代码中的FSDirectory和RAMDirectory,前者将索引写入文件,后者将索引写入内存(详见实例一注释部分)。
IndexWriterConfig类(对IndexWriter类进行一些配置)
代码中配置了版本和分词器。
Analyzer类(分词器的祖宗)
实例一种使用的是StandardAnalyzer分词器,这个也是最常用的的分词器,分词器的作用就是讲一段文字分成一个个Token单元,
便于检索使用。
IndexWriter类(将需要索引的文件或内容进行索引处理)
通过使用indexWriterConfig进行配置,将内存中构造的document对象写入文件。
IndexReader类(读取索引文件,供检索使用)
IndexSearcher类(对读取的内容进行封装,使之可以进行检索)
通过search方法对索引进行检索,返回检索结果。
Query类(查询,类似sql语句,通过indexSearcher使用获取返回结果)
有关各类分词器的使用及区别,见文章http://blog.csdn.net/chaocy/article/details/5938741。
各类搜索方法的文章 http://www.iteye.com/topic/569358
lunece内部的一些基本元素理解 http://blog.csdn.net/wxwzy738/article/details/8098712
3.6版本的token获取方法 http://blog.csdn.net/hiphopmattshi/article/details/7226326
上面文章看完,基本可以实现较简单的lunece开发,本人觉得用处很大,在这里标记一下。
基本解释如上,更深层次的可以阅读lunece提供的文档,或者根据问题自行百度。这篇文章基本就是重造轮子,纯属个人的笔记吧,如有误,谅解。。。