1.lucene初认识:入门例子

来源:互联网 发布:手机wifi网络测试软件 编辑:程序博客网 时间:2024/05/19 02:44

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.创建IndexWriterIndexWriterConfig 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.创建Directorydirectory = FSDirectory.open(new File("E://Luence//index")); // 取得硬盘上的E:/Luence/index下建立的索引目录// 2.创建IndexReader// IndexReader indexReader = IndexReader.open(directory); //该创建方法已经废弃indexReader = DirectoryReader.open(directory);// 创建读取索引对象IndexReader// 3.根据IndexReader创建IndexSearcherindexSearcher = new IndexSearcher(indexReader);// 4.设置要查询的域(属性),查询的内容 keyTerm 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.关闭IndexReadertry {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还创建对应的对象,同时目前这个例子还没对于同一文件的索引【重复添加】的设置,希望各位大神如果看到的话可以告诉下我!

 

0 0