本章节告诉我们怎么用搜索。通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了
本章节,需要掌握如下几个主要API
1.IndexSearcher类:搜索索引的门户,发起者。
   初始化:IndexSearcher is = new IndexSearcher(dir) --- 不产生近实时搜索的效果
                 或者
                 IndexREeader reader = IndexReader.open(dir);IndexSearcher searcher = new IndexSearcher(reader);  --- 产生近实时搜索的效果
   搜索开始:is.search(query, n);

2.TopDocs类,这是search(query, n)返回的结果。其中包含如下重要成员:
    totalHits:实际匹配query的文档数量
    scoreDocs:一个包含搜索结果的ScoreDoc对象数组。按照评分降序排列,即数组最靠前的,其评分最高。并且此数组的大小取值为min(n, totalHits);
            每一个ScoreDoc中又包含两个成员:int Doc表示文档ID;float score表示相关性评分。
            通过Doc,可以获得实际的文档,即:Document doc = is.doc(scoreDoc.doc); 进一步的,通过doc.get("域名"),就可以得到此Doc中具体某个域名对应的域值了。

3.Query(及其子类):封装某种具体查询类型的具体子类。这也是实际放到is.search(query, n);中的query对象
   Query对象的产生方法,可以分为两种:
   A.非QueryParser方式 --- 这一类,基本上都不是使用自然语言来搜索
      TermQuery类: 用于按关键字搜索。 比如:Term t = new Term("contents", "java");  Query query = nwe TermQuery(t);

TermRangeQuery类:通过指定文本首字母的起止和终止范围,来产生query;只适用于文本范围。 比如:TermRangeQuery query = new TermRangeQuery("title2", "d", "j", true, true);

NumericRangeQuery类:用于数值范围的搜索,前提是须索引是采用NumericField建立的。 比如:NumericRangeQuery query = NumericRangeQuery.newInitRange("pubmonth", 200605, 200609, true, true);

PrefixQuery类:搜索包含以指定字符串开头的项的文档。 比如:Term term = new Term("category", "/technology/computers/programming"); PrefixQuery query = new PrefixQuery(term);

BooleanQuery类:用于组合其他查询方式为一体,来提供复杂的查询方式。比如:
          TermQuery searchingBooks = new TermQuery(new Term("subject", "search"));
          Query books2010 = NumericRangeQuery.newIntRange("pubmonth", 201001, 201012, true, true);
          BooleanQuery searchingBooks2010 = new BooleanQuery();
          searchingBooks2010.add(searchingBooks, BooleanClause.Occur.MUST); -- 加入其他query
          searchingBooks2010.add(books2010, BooleanClause.Occur.MUST);-- 加入其他query

PhraseQuery:  用于只知道要搜索文本中的某些单词以及这些单词在文本中的相对位置,而进行的搜索。比如:
           PhraseQuery query = new PhraseQuery();
           query.setSlop(slop); -- 设置两个项的位置之间所允许的最大间隔距离,0表示完全匹配;1表示可以通过移动一次短语,来达到完全匹配;
           for(String word : phrase) {
                 query.add(new Term("field", word));
           }

WildcardQuery类:通配符查询,?表示0个或者1个字母,*代表0个或者多个字母。比如:Query query = new WildcardQuery(new Term("contents", "?ild*"));

FuzzyQuery类:模糊查询,用于匹配和指定项相似的项。采用Levenshtein距离算法。比如:Query query = new FuzzyQuery(new Term("contents", "wuzza"));

MatchAllDocsQuery类:匹配所有文档。比如:Query query = new MatchAllDocsQuery() 或者 Query query = new MatchAllDocsQuery(field);

B.QueryParser方式 --- 支持使用自然语言(包括一些简单的查询表达式)来搜索
      既然是自然语言,那么对于一些字符,需要支持转义。采用反斜杠(\)来表示转义。需要转义的字符包括:\ + - ! ( ) : ^ ] { } ~ * ?    (注意:没有[ )
      QueryParser是对自然语言进行解析,并最终还是产生Query;并且可以产生和上述“非Query类”一一对应的query
  具体包括:
      TermQuery:单个词,在QueryParser中解析为单个TermQuery对象。比如:Query query = parser.parse("computers");

项范围查询(TermRangeQuery或NumericRangeQuery):针对文本或者日期的范围查询。比如:Query query = parser.parse("title2:[Q TO V]");

通配符查询:某个查询字符串中包含一个*或者?,则就被看成通配符查询;Query query = parser.parse("Prefix?uery");

前缀查询:某个查询字符串只在末尾有一个*,则被看成前缀查询。比如:Query query = parser.parse("PrefixQuery*");

布尔查询:综合多种查询方式为一体。比如:Query query = parser.parse("search AND title:[D TO P]");  综合了TermQuery和TermRangeQuery;貌似缺省无法支持NumericRangeQuery

短语查询:双引号内的文本(注意:单项短语会被优化成TermQuery对象)会促使分析器将其转换为PhraseQuery。比如:Query query = parser.parse("\"This is Some Phrase*\"");

模糊查询:在双引号里的文本字符串的最后,加一个~,就成为了模糊查询。比如:Query query = parser.parse("kountry~");

MatchAllDocsQuery:当输入*:*后,就会产生MatchAllDocsQuery

分组查询:用于建立嵌套查询,比如:Query query = parser.parse("(agile OR extreme) AND methodology"); 就表示:查询一定包括methodology,但是可以包括agile或者extreme的文档

《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser的更多相关文章

  1. 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索

    第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...

  2. 《Lucene in Action 第二版》第4章节 学习总结 -- Lucene中的分析

    通过第四章的学习,可以了解lucene的分析过程是怎样的,并且可以学会如何使用lucene内置分析器,以及自定义分析器.下面是具体总结 1. 分析(Analysis)是什么? 在lucene中,分析就 ...

  3. 《Lucene in Action第二版》学习总结---如何在Windows下编译luceneinAction2Edition源码包

    1. 下载此源码包,位置是: www.manning.com/hatcher3,得到:lia2e.tar.gz,然后解压缩得到目录:lia2e,为了以后能辨识,我将此目录改名为:luceneinAct ...

  4. 《TomCat与Java Web开发技术详解》(第二版) 第一章节的学习总结--HTTP组成+基本访问方式

    1.需要看懂HTML文件中的组成元素的基本含义.不同的组成元素,可以使得HTML支持文本,图片(img,将图片发给客户端),静态音频/视频(embed src,将音频视频发给客户端),超链接(href ...

  5. CSAPP深入理解计算机系统(第二版)第三章家庭作业答案

    <深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP) ...

  6. 《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置

    在学习完第三章后(第三章提供的web应用是helloaapp,我将其放到了tomcat/webapps中),对Context元素的作用理解不深:但是当进入第四章后,发现第四章提供的源码包中也有一个叫h ...

  7. 解决Win8不能上网攻略第二版!三步秒杀原驱动

    关于Win8消费者预览版的网卡驱动确实是令人头疼的事情,不少用户都抱怨无法联网而且驱动卸载十分麻烦.IT之家社区luoyousi 此前分享<图文教程:解决Win8消费者预览版不能上网问题> ...

  8. lucene实战(第二版)学习笔记

    初识Lucene 构建索引 为应用程序添加搜索功能 Lucene的分析过程

  9. 《HBase in Action》 第三章节的学习总结 ---- 如何编写和运行基于HBase的MapReduce程序

    HBase之所以与Hadoop是最好的伙伴,我理解就因为两点:1.HADOOP的HDFS,为HBase提供了分布式的存储方式:2.HADOOP的MR为HBase提供的分布式的计算方法.u 其中第一点, ...

随机推荐

  1. Map集合-根据宠物昵称查找宠物

    package collection; /** * 宠物类 * @author * */ public class Pet { private String name; private String ...

  2. iOS教程:如何使用Core Data – 预加载和引入数据

    这是接着上一次<iOS教程:Core Data数据持久性存储基础教程>的后续教程,程序也会使用上一次制作完成的. 再上一个教程中,我们只做了一个数据模型,之后我们使用这个数据模型中的数据创 ...

  3. CSS的7种常用的垂直居中的方法

    1.绝对定位上下百分之五十然后上外边距做外边距都是他的宽高的一半 #child{ width: 200px; height: 150px; position: absolute; left: 50%; ...

  4. [置顶] kubernetes资源类型--Volume

    在Docker的设计实现中,容器中的数据是临时的,即当容器被销毁时,其中的数据将会丢失.如果需要持久化数据,需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中.在K8S中,当Pod重建的时候 ...

  5. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信二(Java)

    上一节实现了client像server端发送请求.本节将实现server端向client回传信息.实现原理非常easy,在原来的基础上.在server端实现输出流,在client实现输入流就可以,详细 ...

  6. Linux查看目录大小

    du -ah --max-depth=1 a表示显示目录下所有的文件和文件夹(不含子目录) h表示以人类能看懂的方式 max-depth表示目录的深度

  7. iOS---sha1加密的一个坑

    OC语言写的sha1加密算法,在网上随手能够搜索到(例如以下便是),可是我不得不说有一些人不责任,没有提醒大家导入必要的系统头文件.从而导致错误 + (NSString *) sha1:(NSStri ...

  8. http接口测试—自动化测试框架设计

    转载:https://my.oschina.net/hellotest/blog/499719 一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值(Js ...

  9. JAVA Eclipse如何开发Android的多页面程序

    Fragment可以认为是Activity的一个界面的组成部分,Fragment必须依存于Activity.   在layout文件夹中新建一个xml文件,布局方式采用RelativeLayout,注 ...

  10. Win7梦幻桌面字体有问题怎么办

      1:首先,下载我提供的压缩文件,解压"Win7中文界面梦幻桌面补丁",得到若干文件,这时可能需要管理员权限,详细的压缩包里有说明.      2: 然后在桌面上单击右键,可以发 ...