本章节告诉我们怎么用搜索。通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了
本章节,需要掌握如下几个主要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. 「Codeforces Round #441」 Classroom Watch

    Discription Eighth-grader Vova is on duty today in the class. After classes, he went into the office ...

  2. java多线程设计模式(3)读写锁模式

    1 Read-Write Lock Pattern Read-Write Lock Pattern是一种将对于共享资源的访问与修改操作分离,称为读写分离.即访问是reader,修改是write,用单独 ...

  3. tiny4412 串口驱动分析六 --- TTY驱动架构

    转载: http://www.linuxidc.com/Linux/2013-11/92639.htm 参考: http://blog.csdn.net/lamdoc/article/details/ ...

  4. 【转】matlab 字符串处理函数

    原文地址 matlab 字符串处理函数 % 字符串处理 a='  a';b='b  b';c='cccc';m='' % 获取字符串长度 length(a)     % 连接两个字符串,每个字符串最右 ...

  5. ios 字体类型设置 倾斜加粗等

    后面加-Bold就是加粗 加-Oblique就是倾斜等 还有不懂请看http://iosfonts.com/ iPhone 5.0 iPad 5.0 Font Families: 58 Font Fa ...

  6. [置顶] kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim

    概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...

  7. Makefile之文件搜索

    Makefile之文件搜索 1.Makefile 文件中的"VPATH"变量 如果没有指明这个变量,make只会在当前目录下查找依赖文件和目标文件: 如果定义了这个变量,make会 ...

  8. HOOK大法实现不修改程序代码给程序添加功能

    [文章标题]: HOOK大法实现不修改程序代码给程序添加功能[文章作者]: 0x18c0[软件名称]: Scylla[使用工具]: OD.Stub_PE.ResHacker[版权声明]: 本文原创于0 ...

  9. 深入理解ES6里的promise

    一.ES6 Promise是什么? 复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受.那么第一个问题来了,Promise是什么呢?是一个类?对象?数组?函数? 别猜了,直接打印出 ...

  10. CvArr、Mat、CvMat、IplImage、BYTE转换

    一.Mat类型:矩阵类型,Matrix.     在openCV中.Mat是一个多维的密集数据数组. 能够用来处理向量和矩阵.图像.直方图等等常见的多维数据.     Mat有3个重要的方法:     ...