Lucene | 学习篇 | Lucene查找索引

    xiaoxiao2023-03-24  4

    一. 前言

               上一篇文章学习了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创建IndexSearcher IndexSearcher 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:  对于如何搜索:代码中都有详细的注释。

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

    转载请注明原文地址: https://ju.6miu.com/read-1202425.html
    最新回复(0)