1.lucene初认识:入门例子

来源:转载


Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加达) 家族中的一个开源项目。也是目前最为流行的基于Java开源全文检索工具包。

下面看下Lucene的一个简单的入门例子:

使用版本:Lucene 4.9   官方网站: http://lucene.apache.org/

开始:

1.创建普通java工程;

2.引入包:

 

1.建立索引

 

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.Store;import org.apache.lucene.document.StringField;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.store.RAMDirectory;import org.apache.lucene.util.Version;public class CreateIndex { /** * 创建索引 */ public void index(){ IndexWriter indexWriter = null; try { //1.创建Directory //Directory directory = new RAMDirectory(); //在内存中创建索引 Directory directory = FSDirectory.open(new File("E:/Luence/index"));//在硬盘上的E:/Luence/index下建立索引目录 //2.创建IndexWriter IndexWriterConfig iwconfig = new IndexWriterConfig(Version.LUCENE_40, new StandardAnalyzer(Version.LUCENE_40)); indexWriter = new IndexWriter(directory, iwconfig); //3.创建Document对象 Document document = null; File file = new File("E:/Luence/doc"); for (File f : file.listFiles()) { //4.添加Document对象的Filed属性 document = new Document(); System.out.println("-----为的文件添加索引:"+f.getName()); // document.add(new Field("content",new FileReader(f))); //该new Field()方法已废弃 document.add(new TextField("content", new FileReader(f))); //存入内容 document.add(new StringField("filename", f.getName(), Store.YES)); //存入文件名 document.add(new StringField("filePath", f.getPath(), Store.YES)); //存入文件路径 //5.使用IndexWriter把文档Docment对象存入索引 indexWriter.addDocument(document); } System.out.println("-------------------索引创建完毕!!----------------------"); } catch (IOException e) { e.printStackTrace(); } finally{ if (indexWriter != null) { try { indexWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 


2.操作索引,查找内容

<span style="font-size:12px;">import java.io.File;import java.io.IOException;import org.apache.lucene.document.Document;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.Term;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.store.RAMDirectory;import org.apache.lucene.util.Version;/** * 1.创建Directory * 2.创建IndexReader * 3.根据IndexReader创建IndexSearcher * 4.创建搜索的Query * 5.根据Searcher搜索并且返回TopDocs * 6.根据TopDocs获取ScoreDoc对象 * 7.根据Seacher和ScoreDoc对象获取具体的Document对象 * 8.根据Document对象获取需要的值 * 9.关闭IndexReader * * @author Leo * */public class OperaLucene { public void searcher(String key) { Directory directory = null; IndexReader indexReader = null; IndexSearcher indexSearcher = null; try { // 1.创建Directory directory = FSDirectory.open(new File("E://Luence//index")); // 取得硬盘上的E:/Luence/index下建立的索引目录 // 2.创建IndexReader // IndexReader indexReader = IndexReader.open(directory); //该创建方法已经废弃 indexReader = DirectoryReader.open(directory);// 创建读取索引对象IndexReader // 3.根据IndexReader创建IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 4.设置要查询的域(属性),查询的内容 key Term term = new Term("content", key); TermQuery query = new TermQuery(term); TopDocs topdocs = indexSearcher.search(query, 5); ScoreDoc[] scoreDocs = topdocs.scoreDocs; System.out.println("--查询结果总数:" + topdocs.totalHits + "; 最大的评分:" + topdocs.getMaxScore()); // 遍历搜索结果 for (ScoreDoc scoreDoc : scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); System.out.println("--搜索结果:--" + document.get("filename") + "[" + document.get("filePath") + "]"); // System.out.println("content:" + document.get("content")); } } catch (Exception e) { // TODO: handle exception } finally { if (indexReader != null) { // 9.关闭IndexReader try { indexReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }}</span>


 

3.运行测试

<span style="font-size:12px;">public class MyLuenceMain { public static void main(String[] args) { //1.创建索引 CreateIndex createIndex = new CreateIndex(); createIndex.index(); //2.开始搜索 String key = "lucene"; OperaLucene operaLucene = new OperaLucene(); operaLucene.searcher(key); }}</span>


4.运行结果

 

-----为的文件添加索引:1.txt-----为的文件添加索引:2.txt-----为的文件添加索引:3.txt-------------------索引创建完毕!!------------------------查询结果总数:2; 最大的评分:0.1058217--搜索结果:--1.txt[E:/Luence/doc/1.txt]--搜索结果:--1.txt[E:/Luence/doc/1.txt]


 

小结:由于Lucene的各版本变化较大,很多类的构造方法都有不同程度的废弃或是新增,还是要结合官方对应版本的api还创建对应的对象,同时目前这个例子还没对于同一文件的索引【重复添加】的设置,希望各位大神如果看到的话可以告诉下我!

 



分享给朋友:
您可能感兴趣的文章:
随机阅读: