《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 其中第一点, ...
随机推荐
- iOS 自定义字体设置
有时候客户都要求使用方正兰亭刊黑字体,可是iOS没有自带这个字体,肿么办 ,只能自己自定义字体了,下面是自定义字体的几个重要步骤: 1.下载字体资源文件(.ttf或.otf格式的文件) 比如说你要使用 ...
- hdu5884 Sort
//--------------------------------------------------------------- /*---贪心策略+二分+队列 -----将原数组排序,然后每次取k ...
- 1019(C++)
计算n个数的最小公倍数,可用欧几里得算法计算两个数字的最大公约数,再计算两个数最小公倍数 有了2个数最小公倍数算法就简单了,即为:计算第一和第二个数得到最小公倍数lc,再计算lc和第三个数最小公倍数. ...
- ubuntu配置无密码登录
1 本地生成ssh公钥和私钥, 2将公钥拷贝到ubuntu上的.ssh/authorized_keys 中
- 控制面板cpl大全
ALSNDMGR.CPL AC97 Audio组态设定appwiz.cpl 添加和删除程序bthprops.cpldesk.cpl 显示属性firewall.cpl Windows防火墙hdwwi ...
- Java 数字签名原理及产生
数字签名与数字证书 关于数字签名的介绍可以参考以上这篇. 这里稍微说一下不对称加密的方式: 用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密. 这样比对称加密更安全 Java 中数字签名 ...
- 获取本机IP,用户代理
1.获取本机IP:http://httpbin.org/ip 2.获取用户代理 https://httpbin.org/user-agent https://httpbin.org/ httpbin( ...
- BeagleBone Black板第四课:简单LED控制实验
BBB板第四课:简单LED控制实验 学习BBB板的终于目的是想像单片机一样做控制,但控制思路全然不一样(Linux下控制硬件设备实质就是对相关设备虚拟文件的读写).研究了几天头都大了还是没有进展,网上 ...
- setContentView
setContentView(R.layout.main)在Android里面,这句话是什么意思? R.layout.main是个布局文件即控件都是如何摆放如何显示的,setContentView就是 ...
- IOS--苹果各地区开发者支援的电话号码
网页地址: https://developer.apple.com/contact/phone/ 中国区的咨询热线:4006 701 855 邓白氏申请中心的电话(400-6701855)