lucence 入门

来源:互联网 发布:魏强斌 知乎 编辑:程序博客网 时间:2024/06/05 19:13

Document

Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段

 

Field

Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。

 

Analyzer

在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。

 

IndexWriter

IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来

 

Directory

这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置

 

package hb.com;import java.io.File;import java.io.FileReader;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.CorruptIndexException;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;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.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.store.LockObtainFailedException;import org.apache.lucene.util.Version;import org.junit.Test;public class HelloLucence {/** * 建立索引 */public void index(){IndexWriter writer = null;try {//1、创建Directory//Directory directory = new RAMDirectory();Directory directory = FSDirectory.open(new File("d:/lucence/indexdemo"));//2、创建IndexWriterIndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35));writer = new IndexWriter(directory, iwc);//3、创建Document对象Document doc = null;//4、为Document添加FieldFile f = new File("D:/js继承");for(File file : f.listFiles()){doc = new Document();doc.add(new Field("content", new FileReader(file)));doc.add(new Field("filename", file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));doc.add(new Field("path",file.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));//5、通过IndexWriter添加文档到索引writer.addDocument(doc);}} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{if(writer != null){//一定要关闭,不然无法将索引信息写入到文件中try {writer.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}public static void main(String[] args) {HelloLucence helloLucence = new HelloLucence();helloLucence.index();}@Testpublic void search(){Directory directory;try {//1、创建Directorydirectory = FSDirectory.open(new File("d:/lucence/indexdemo"));//2、创建IndexReaderIndexReader reader = IndexReader.open(directory);//3、根据IndexReader创建IndexSearcherIndexSearcher searcher = new IndexSearcher(reader);//4、创建搜索的query//创建query来确定要搜索文件的内容,第二个参数表示搜索的域QueryParser parser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));Query query = parser.parse("extend");//5、根据search搜索并返回TopDocsTopDocs tds = searcher.search(query, 10);//6、根据TopDocs获取ScoreDoc对象ScoreDoc[] scoreDocs = tds.scoreDocs;for(ScoreDoc sd : scoreDocs){//7、根据searcher和ScoreDoc对象获取具体的Document对象Document d = searcher.doc(sd.doc);//8、根据Document对象获取需要的值System.out.println(d.get("filename")+"["+d.get("path")+"]");}//9、关闭readerreader.close();} catch (IOException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}}}

 

Query

这是一个抽象类,他有多个实现,比如TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。

 

Term

Term是搜索的基本单位,一个Term对象有两个String类型的域组成。生成一个Term对象可以有如下一条语句来完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。

 

TermQuery

TermQuery是抽象类Query的一个子类,它同时也是Lucene支持的最为基本的一个查询类。生成一个TermQuery对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的构造函数只接受一个参数,那就是一个Term对象。

 

IndexSearcher

IndexSearcher是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。

 

TopScoreDocCollector

TopScoreDocCollector搜搜返回的结果

0 0