《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser
本章节告诉我们怎么用搜索。通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了
本章节,需要掌握如下几个主要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的更多相关文章
- 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...
- 《Lucene in Action 第二版》第4章节 学习总结 -- Lucene中的分析
通过第四章的学习,可以了解lucene的分析过程是怎样的,并且可以学会如何使用lucene内置分析器,以及自定义分析器.下面是具体总结 1. 分析(Analysis)是什么? 在lucene中,分析就 ...
- 《Lucene in Action第二版》学习总结---如何在Windows下编译luceneinAction2Edition源码包
1. 下载此源码包,位置是: www.manning.com/hatcher3,得到:lia2e.tar.gz,然后解压缩得到目录:lia2e,为了以后能辨识,我将此目录改名为:luceneinAct ...
- 《TomCat与Java Web开发技术详解》(第二版) 第一章节的学习总结--HTTP组成+基本访问方式
1.需要看懂HTML文件中的组成元素的基本含义.不同的组成元素,可以使得HTML支持文本,图片(img,将图片发给客户端),静态音频/视频(embed src,将音频视频发给客户端),超链接(href ...
- CSAPP深入理解计算机系统(第二版)第三章家庭作业答案
<深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP) ...
- 《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置
在学习完第三章后(第三章提供的web应用是helloaapp,我将其放到了tomcat/webapps中),对Context元素的作用理解不深:但是当进入第四章后,发现第四章提供的源码包中也有一个叫h ...
- 解决Win8不能上网攻略第二版!三步秒杀原驱动
关于Win8消费者预览版的网卡驱动确实是令人头疼的事情,不少用户都抱怨无法联网而且驱动卸载十分麻烦.IT之家社区luoyousi 此前分享<图文教程:解决Win8消费者预览版不能上网问题> ...
- lucene实战(第二版)学习笔记
初识Lucene 构建索引 为应用程序添加搜索功能 Lucene的分析过程
- 《HBase in Action》 第三章节的学习总结 ---- 如何编写和运行基于HBase的MapReduce程序
HBase之所以与Hadoop是最好的伙伴,我理解就因为两点:1.HADOOP的HDFS,为HBase提供了分布式的存储方式:2.HADOOP的MR为HBase提供的分布式的计算方法.u 其中第一点, ...
随机推荐
- luogu P1494 岳麓山上打水
题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...
- 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63740442 向大(hei)佬(e)实力学(di ...
- 用swift开发自己的MacOS锁屏软件(二)
上一篇中尝试写了hello world,这一篇中,开始尝试锁屏功能 1.尝试查找swift有没有相关的函数,可以控制系统锁屏之类的,结果并没有找到 2.尝试查找cocoa有没有相关的接口,结果仍然没有 ...
- 【视频】Linux高级程序设计01.1开发工具及gcc gdb
[课程笔记] Linux 下编辑调试工具,gcc,gdb. 把高级语言编译成二进制可执行代码的工具. 需要经历四个步骤: (1) 预处理:去掉注释,进行宏替换(#define相关),头文件(#incl ...
- 【MySQL】undo,redo,2PC,恢复思维导图
http://blog.itpub.net/22664653/viewspace-2131353/
- Delphi CRC32Verify控件
unit CRC32Verify; interface uses Windows, Messages, SysUtils, Classes, Forms; CONST table: ARRA ...
- (转)秒杀系统中如何动态生成下单随机URL
秒杀系统中通常会避免用户之间访问下单页面的URL(避免使用爬虫来造成不公平).所有需要将URL动态化,即使秒杀系统的开发人员也无法在知晓在秒杀开始时的URL.解决办法是在获取秒杀URL的接口中,返回一 ...
- kubernetes社区项目生态概览
原文 http://dockone.io/article/2075 作为容器集群管理技术的最流行的技术,kubernetes,自从2014在github上开源后,已经通过多个项目形成了一个生态,以下 ...
- android下socket编程问题:服务器关闭时,客户端发送请求的异常处理
我用socket分别创建了一个服务器和一个客户端. 当服务器程序运行时,客户端和服务器发送接收数据是OK的. 但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException.但 ...
- 资源的GPUAddress
BufferAddress CommandHandle TextureHandle 给shader采样的 ImageHandle 给shader load store的.../imageLoad() ...