【Lucene4.8教程之三】搜索
1、关键类
Lucene的搜索过程中涉及的主要类有以下几个:
(1)IndexSearcher:执行search()方法的类
(2)IndexReader:对索引文件进行读操作,并为IndexSearcher提供搜索接口
(3)Query及其子类:查询对象,search()方法的重要参数
(4)QueryParser:根据用户输入的搜索词汇生成Query对象。
(5)TopDocs:search()方法返回的前n个文档
(6)ScoreDocs:提供TopDocs中搜索结果的访问接口
2、搜索的关键步骤
(1)创建IndexReader
(2)使用IndexReader创建IndexSearcher
(3)根据搜索关键字,使用QueryParser生成Query对象
(4)以Query作为参数调用IndexSearcher.search(),执行搜索
(5)以TopDocs以及ScoreDocs遍历结果并处理
示例代码如下:
//(1)创建IndexReader
Directory indexDir2 = FSDirectory.open(indexDir);
IndexReader ir = DirectoryReader.open(indexDir2);
//(2)使用IndexReader创建IndexSearcher
IndexSearcher searcher = new IndexSearcher(ir);
//(3)根据搜索关键字,使用QueryParser生成Query对象
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48));
Query query = null;
try {
query = parser.parse(term);
} catch (ParseException e) {
e.printStackTrace();
}
//(4)以Query作为参数调用IndexSearcher.search(),执行搜索
TopDocs docs = searcher.search(query, 30); //(5)以TopDocs以及ScoreDocs遍历结果并处理
ScoreDoc[] hits = docs.scoreDocs;
System.out.println(hits.length);
for (ScoreDoc hit : hits) {
System.out.println("doc: " + hit.doc + " score: " + hit.score);
}
3、关于IndexReader
(1)IndexReader未提供构造函数,因此需要通过DirectoryReader.open()方法来创建一个IndexReader。
(2)创建一个IndexReader需要较大的系统开销,因此最好在所有搜索期间都重复使用一个IndexReader,只有在必要的时候才建议打开新的IndexReader。
(3)在创建IndexReader时,它会搜索已有的索引快照,如果你需要搜索索引中的变更信息,那么必须打开一个新的reader。所幸的是IndexReader.reopen方法是一个获取新IndexReader的有效方法,能在耗费较少系统资源的情况下使用当前reader来获取索引中所有的变更信息。【新版本中已废弃,待确认替代方法】
4、关于QueryParser与Query的子类
对于一个搜索而言,其核心语句为:
searcher.search(query, 10);
此时,其最重要的参数为一个Qeury对象。构造一个Query对象有2种方法:【均以在contents域搜索java关键词为例】
(1)使用Query的子类,如BooleanQuery, ConstantScoreQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, SpanQuery, TermQuery,直接实例化一个对外:
searcher.search( new TermQuery(new Term("contents","java")), 10);
以下语句结构更为清晰
Term term= new Term("contents","java");
TermQuery tq = new TermQuery(term);
searcher.search(tq , 10);
此外,即为在contents域中搜索包括java的文档。
(2)使用QueryParser的parse()方法,对所传入的搜索关键词汇进行解释,并返回query对象。
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48));
Query query = null;
try {
query = parser.parse("java");
} catch (ParseException e) {
e.printStackTrace();
}
TopDocs docs = searcher.search(query, 10);
以上语句创建一个QueryParser,其默认搜索域为contents,然后将搜索词汇转化为Query对象。
如果指定QueryParser的默认搜索域为全部?如何指定一个Query的搜索域?
关于QueryParser与Query子类的更详细内容,请参见
【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象 http://blog.csdn.net/jediael_lu/article/details/33288793
【Lucene4.8教程之三】搜索的更多相关文章
- 【Lucene4.8教程之三】搜索 2014-06-21 09:53 1532人阅读 评论(0) 收藏
1.关键类 Lucene的搜索过程中涉及的主要类有以下几个: (1)IndexSearcher:执行search()方法的类 (2)IndexReader:对索引文件进行读操作,并为IndexSear ...
- 【Lucene4.8教程之二】索引
一.基础内容 0.官方文档说明 (1)org.apache.lucene.index provides two primary classes: IndexWriter, which creates ...
- 【Lucene4.8教程之二】索引 2014-06-16 11:30 3845人阅读 评论(0) 收藏
一.基础内容 0.官方文档说明 (1)org.apache.lucene.index provides two primary classes: IndexWriter, which creates ...
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作
在Lucene对文本进行处理的过程中,可以大致分为三大部分: 1.索引文件:提取文档内容并分析,生成索引 2.搜索内容:搜索索引内容,根据搜索关键字得出搜索结果 3.分析内容:对搜索词汇进行分析,生成 ...
- 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作
版权声明:本文为博主原创文章.转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/deta ...
- EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页
在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的 ...
- seo搜索优化教程11-seo搜索优化关键词策略
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第11课 关键词在seo搜索优化中有着重要的地位,本节主要讲解seo搜索优化中关键词优化的相 ...
随机推荐
- Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 部署错误: 启动 Tomcat 失败。-- '127.0.0.1' 不是内部或外部命令,也不是可运行的程序
真的管用,不知道为啥管用.转载自:http://blog.sina.com.cn/s/blog_709548200102vgy4.html 问题描述: 新安装的NetBeans8.0.2,安装过程中还 ...
- Android动态加载代码技术
Android动态加载代码技术 在开发Android App的过程当中,可能希望实现插件式软件架构,将一部分代码以另外一个APK的形式单独发布,而在主程序中加载并执行这个APK中的代码. 实现这个任务 ...
- [Head First Python]3. 文件与异常:处理错误
datafile.txt Man: Is this the right room for an argument? Other Man: I've told you once. Man: No you ...
- python 多线程、多进程
一.首先说下多线程.多进程用途及异同点,另外还涉及到队列的,memcache.redis的操作等: 1.在python中,如果一个程序是IO密集的操作,使用多线程:运算密集的操作使用多进程. 但是,其 ...
- 转:linux运维工程师
运维中关键技术点解剖:1 大量高并发网站的设计方案:2 高可靠.高可伸缩性网络架构设计:3 网站安全问题,如何避免被黑?4 南北互联问题,动态CDN解决方案:5 海量数据存储架构 一.什么是大型网站运 ...
- centos minimal 安装无法自定义分区
安装了太多版本的linux,最后还是决定安装CentOS的minimal版本: 安装的时候发现,没办法自定义分区,经查确实在命令行界面下安装是没有自定义分区的. 但是不管怎么安装都是没有图形介面,最后 ...
- information_schema.key_column_usage 学习
information_schema.key_column_usage 表可以查看索引列上的约束: 1.information_schema.key_column_usage 的常用列: 1.cons ...
- C# XML序列化帮助类代码
public static class XmlHelper { private static void XmlSerializeInternal(Stream stream, object o, En ...
- Django的痛点
如果一个html里面写了多个<a href = A.html > ,启动A.html也有这个<a herf = B.xml> 这个时候Django怎么访问这些url?
- C51编程中对单片机绝对地址访问的两种方法
在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间.C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定.为了能够在C ...