你的位置:首页 > 软件开发 > Java > Apache Lucene(全文检索引擎)—搜索(第二篇)

Apache Lucene(全文检索引擎)—搜索(第二篇)

发布时间:2016-04-14 16:00:12
目录  1. Apache Lucene(全文检索引擎)—创建索引(第一篇):http://www.cnblogs.com/hanyinglong/p/5387816.html  2. Apache Lucene(全文检索引擎)&mdash ...

目录

  1. Apache Lucene(全文检索引擎)—创建索引(第一篇):http://www.cnblogs.com/hanyinglong/p/5387816.html

  2. Apache Lucene(全文检索引擎)—搜索(第二篇):http://www.cnblogs.com/hanyinglong/p/5391269.html

  3. Apache Lucene(全文检索引擎)—分词器(第三篇):

    本项目Demo已上传GitHub,欢迎大家fork下载学习:https://github.com/kencery/Lucene_Compass(项目内部有很详细的注释)

1. 搜索思路

  a. 当用户在搜索的时候,先在词汇表中查找,得到符合条件的文档编号列表,再根据文档编号去索引库中得到数据(Document)。

  b. Lucene实现搜索的思路

    b.1 首先把需要查询的字符串转换为Query对象,把查询字符串转换为Query需要使用QueryParser、MultiFieldQueryParser,查询字符串首先也要经过分词器(Analyzer),要求搜索时使用的Analyzer和建立索引的时候使用的Analyzer要一致,否则极有可能搜索不出正确的结果。

    b.2 调用indexSearcher.search()进行查询得到结果,此方法返回值为TopDocs,是包含结果的多个信息的一个对象,其中有totalHits代表总记录数,ScoreDoc数组代表一个结果的相关度得分和文档编号等信息的对象。

    b.3 取出需要的数据文档编号列表,调用Document doc=indexSearcher.doc(docId)以取出指定编号对应的Document数据。

2. 理解核心搜索类

  a.  public class org.apache.lucene.search.IndexSearcher

    a.1 IndexSearch是用来在建立好的索引上进行搜索的,它提供了很多搜索方法,其中一些在抽象基类Searcher中实现

    a.2 它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。

    a.3 在使用完IndexSearcher后,需要释放资源,调用方法:indexSearcher.getIndexReader().close();

  b. public final class org.apache.lucene.index.Term

    b.1 Term是搜索的基本单元,一个Term对象由两个Sting类型的域组成,字段的名称和字段的值

    b.2  在搜索时,你可以创建Term对象并和TermQuery同时使用,其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键字

      Query query=new TermQuery(new Term("content","lucene"));

      TopDocs topDocs= indexSearcher.search(query,100 );  //返回查询出来的前n条结果

    b.3 这段代码使用Lucene查找出content字段中含有单词lucene的所有文档,因为TermQuery对象继承自它的抽象父类Query,所以你可以在等式的左边用Query类型。

  c.  public abstract class org.apache.lucene.search.Query

    c.1 Query是一个抽象类,这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。

    c.2 Query包含了很多子(必须通过一系列子类来表达检索的具体需求,在4个模块中有说明),具体请同时按住Ctrl+T查看

  d. public class org.apache.lucene.search.TermQuery 

    d.1 TermQuery是抽象类Query的一个子类,他同时也是Lucene支持的最为基本的一个查询类。

    d.2 生成一个TermQuery对象由如下语句完成(它的构造函数主要只接受一个参数,那就是一个Term对象)。

      TermQuery query=new TermQuery(new Term("content","lucene"));

  e. public class org.apache.lucene.search.TopDocs 

    e.1 TopDocs是用来保存搜索的结果的,思路是:指向相互匹配的搜索条件的前N个搜索结果,它是指针的简单容器指向他们的搜索结果输出的文档。

    e.2 基于性能的考虑,TopDocs的实例并不是从索引中加载所有匹配查询的所有文档,而是每次按照你给的条件查询出一小部分展现给用户(分页原理)。

  f.QueryParser和MultiFieldQueryParser

    f.1 QueryParser查询分析器,处理用户输入的查询条件,把用户输入的非格式话检索词转化成后台可以使用的Query对象。

    f.2 MultiFieldQueryParser是QueryParser的子类,与父类相比,MultiFieldQueryParser可以在多个属性中搜索。

3. 关键字搜索的大致实现

  a. 代码以在github上开源,地址:https://github.com/kencery/Lucene_Compass

 1   /** 2    * 测试搜索 3    * @throws Exception 4   */ 5   @Test 6   public void testSearch() throws Exception { 7     //1 搜索条件 8     String queryCondition="lucene"; 9     //2 执行搜索(lucene)10     List<Article> articles=new ArrayList<Article>();11     //--------------------------搜索代码-----------------------------12     Directory directory=FSDirectory.open(Paths.get("./indexDir/")); //索引库目录13     Analyzer analyzer=new StandardAnalyzer();    //分词器14 15     //2.1 把查询字符串转为Query对象(只在title中查询)16     QueryParser queryParser=new QueryParser("title",analyzer);17     Query query=queryParser.parse(queryCondition);18 19     //2.2 执行搜索得到结果20     IndexReader indexReader=DirectoryReader.open(directory);21     IndexSearcher indexSearcher=new IndexSearcher(indexReader);22     TopDocs topDocs= indexSearcher.search(query, 100); //返回查询出来的前n条结果23 24     Integer count= topDocs.totalHits; //总结果数量25     ScoreDoc[] scoreDocs=topDocs.scoreDocs; //返回前N条结果信息26 27     //2.3 处理结果28     for (int i = 0; i < scoreDocs.length; i++) {29       ScoreDoc scoreDoc=scoreDocs[i];30       int docId=scoreDoc.doc;31       System.out.println("得分是:"+scoreDoc.score+",内部编号是:"+docId);32       //根据内部编号取出真正的Document数据33       Document doc=indexSearcher.doc(docId);34       //将document转化为Article35       Article article=new Article(Integer.parseInt(doc.get("id")), doc.get("title"), doc.get("content"));36       articles.add(article);      37     }38     //------------------------------------------------------------39     //3 控制台显示结果40     System.err.println("总结果数:"+count);41     for (Article article : articles) {42       System.out.println("查询结果为:"+article);43     }44     indexSearcher.getIndexReader().close();45   }

原标题:Apache Lucene(全文检索引擎)—搜索(第二篇)

关键词:Apache

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录