Lucene学习教程——Lucene查找索引

来源:互联网 发布:nginx header传递吗 编辑:程序博客网 时间:2024/06/09 18:42

一. 前言

           上一篇文章学习了Lucene索引的创建,这篇文章将介绍如何实现搜索。


二. 代码实现

          

package com.yc.lucene.study;import java.io.File;import java.io.IOException;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.queryparser.classic.ParseException;import org.apache.lucene.queryparser.classic.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.util.Version;/** * 索引的搜索 * @author HM * */public class Searcher {public void SearcherIndex(){Directory directory=null;DirectoryReader dReader=null;try {//1.创建Directory,(我们要知道我们要去哪里搜索)directory=FSDirectory.open(new File("G:/lucene/index01"));//3.我们要读取这个索引文件    dReader=DirectoryReader.open(directory);//4.我们需要创建一个IndexSearch对象 , 根据DirectoryReader创建IndexSearcherIndexSearcher searcher=new IndexSearcher(dReader);//4.创建查询的Query  (创建查询的字符串,与sql语句一样)  //创建Parser来确定要搜索的内容Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43); //三个参数:版本号,搜索的域,分词器必须与创建索引的分词器一样QueryParser parser=new QueryParser(Version.LUCENE_43, "content",analyzer);   //通过QuerParser来创建我们的Query,表示搜索与content中包含java的文档Query query=parser.parse("JAVA");  //这里面存放的就是我们要搜索的内容,就是在content域中搜索包含“时候”的文字//5.根据Searcher的搜索返回一个TopDocs的文档TopDocs tds=searcher.search(query, 10); //放一个query,和一个查询的条数//6.根据TopDocs获取一个ScoreDoc对象。ScoreDoc[] sds=tds.scoreDocs;//每一个文档id都放在tds中 的scoreDocs中//然后我们循环获取Doc的Id,来获取具体的Document对象for (ScoreDoc scoreDoc : sds) {//7.根据Seacher和ScoreDoc对象获取具体的Document对象Document doc=searcher.doc(scoreDoc.doc);  //通过Searcher来获取这篇文档,传入一个doc 的Id值//8.根据Document对象获取我们所需要的具体的值System.out.println("文件的名称"+doc.get("filename"));System.out.println("文件的路径"+doc.get("path"));}} catch (IOException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}finally{try {//9.关闭相关资源if(directory!=null) directory.close();if(dReader!=null) dReader.close();} catch (IOException e) {e.printStackTrace();}}}}
   Ps:  因为这里我采用的是简单分词,所以对中文的分词效果不是很好,我这里搜索的是"Java"  
Query query=parser.parse("JAVA");
因此我又重新在《改变就在一瞬间》.txt书中加了一句:I like Java   然后重新创建索引。

     2.1   测试结果

                     同样我采用的是Junit测试:


                      结果输出:   



   Ps:  对于如何搜索:代码中都有详细的注释。

           下一篇将介绍如何删除索引和更新索引


1 0
原创粉丝点击