上一篇文章我们讲到了索引的建立,下一步就行搜索了,实现简单的搜索功能,不多说,直接贴代码,因为代码里面有注释,所以其它的也不多说了,本来也不是复杂的东西。
package lucene; 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.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; public class SearcherLucene { public void searcher() throws IOException, ParseException { //1、创建Directory,因为我们在建立索引时,是建立在这个directory里面,所以我们搜索也是在这个directory里面搜 Directory directory=FSDirectory.open(new File("E:/lucene/index01")); //索引创建于硬盘中 //2、创建IndexReader IndexReader indexReader=IndexReader.open(directory); //3、根据IndexReader创建IndexSearcher IndexSearcher indexSearcher=new IndexSearcher(indexReader); //4、创建QueryParser查询解析器来确定搜索的文件内容(意思是,你要从哪里搜索),第二个参数是搜索域,意思是从名为content的搜索域里面找 QueryParser queryParser=new QueryParser(Version.LUCENE_43,"content",new StandardAnalyzer(Version.LUCENE_43)); //5、根据QueryParser来创建Query对象,把要搜索的内容,从哪里搜,怎么搜都封装成一个对象 //用java作为参数,意思就是在content域中找到有关键字为java的 //Query query=queryParser.parse("java"); Query query=queryParser.parse("zhhzhhzhh");//如果在建立索引之后改变了硬盘中的文章的内容,要重新建立索引,否则新增的内容不会别搜索到 //6、根据Query对象作为参数,用IndexSearcher来搜索内容,返回一个TopDocs对象 //(实际上,这个对象封装了那些最符合搜索条件的结果的信息) TopDocs topDocs=indexSearcher.search(query, 10); //7、根据TopDocs对象来获取存了ScoreDoc对象的数组 //(ScoreDoc是一个评分对象,因为lucene在搜索过程中,给每一个资源都评分,然后按照分数高低来决定最符合的搜索条件的结果,这个对象同样存了这些结果的信息) ScoreDoc[] scoreDocs=topDocs.scoreDocs; for(ScoreDoc scoreDoc:scoreDocs) { //8、根据IndexSearcher和ScoreDoc来确定具体的Document对象 Document document=indexSearcher.doc(scoreDoc.doc); //9、根据Document对象得到想要的值 System.out.println("文章的编号:"+scoreDoc.doc+" "+"文件名filename:"+document.get("filename")+" "+"文件路径filepath:"+document.get("filepath")); } //10、关闭IndexReader indexReader.close(); } }
下面为这个搜索写个测试类:
public class LuceneSearcherTest { @Test public void testSearcher() throws IOException, ParseException { SearcherLucene searcherLucene=new SearcherLucene(); searcherLucene.searcher(); } }
下面是执行结果:
文章的编号:0 文件名filename:jvm.hprof - 副本.fff 文件路径filepath:E:\lucene\luceneexamplefile\jvm.hprof - 副本.fff 文章的编号:1 文件名filename:jvm.hprof - 副本.hhh 文件路径filepath:E:\lucene\luceneexamplefile\jvm.hprof - 副本.hhh 文章的编号:2 文件名filename:jvm.hprof.ini 文件路径filepath:E:\lucene\luceneexamplefile\jvm.hprof.ini 文章的编号:3 文件名filename:jvm.hprof.log 文件路径filepath:E:\lucene\luceneexamplefile\jvm.hprof.log 文章的编号:4 文件名filename:jvm.hprof.txt 文件路径filepath:E:\lucene\luceneexamplefile\jvm.hprof.txt
因为在做测试中,我随便找了几篇txt文档,但这些都不会影响到搜索的结果。这个功能还是比较简单的,在逻辑和代码上都不会复杂。
这样就可以简单的实现对一些文本文档建立索引和进行简单的搜索了。
扫描二维码关注公众号,回复:
645696 查看本文章