【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搜索优化中关键词优化的相 ...
随机推荐
- fddd
<script language="JavaScript" type="text/javascript"> function exportChart ...
- php ajax 同时验证 用户名 密码
今天写了一个程序分享给大家,该程序是ajax密码和用户名验证问题 第一步 先在数据库里建立一张表 有3个字段 为 id name pass 第二步 写html页面,需要引入jq库 请到官网自行下载 & ...
- find系列之xargs命令
xargs的功能--> 将标准输入转换为命令行参数,供后面的命令调用,但是一次只能依据-d和-n限定的行数来推送一行 xargs的作用--> 使那些不能利用stdin的命令 ...
- Eclipse中设置条件断点
1.在要添加断点的变量那一行前双击,添加断点: 2.在该断点处点击鼠标右键,在弹出的选项卡中选择“断点属性”Breakpoint Properties; 3.在断点属性选项卡中勾选Enabled复选框 ...
- 信号量 <第六篇>
一.ManualResetEvent 该对象有两种信号量状态True和False.构造函数设置初始状态. WaitOne:该方法用于阻塞线程,默认是无限期的阻塞,支持超时阻塞,如果超时就放弃阻塞,这样 ...
- Path Sum II 解答
Question Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the ...
- hdu 5491 The Next(暴力枚举)
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...
- telnet查看memcached运行参数说明
在Linux/Windows系统中启动memcached的命令请查看http://weilingfeng98.iteye.com/admin/blogs/1741179 启动完memcached服务器 ...
- Android项目打包开启proguard的混淆优化带来的问题
1.引入一个sdk以后.打包报错: [INFO] Unexpected error while evaluating instruction: [INFO] Class = [com/ ...
- RehHat enterprise 5.4 安装git
今天想来研究一下git,就自己安装一个试试,没想到遇到各种问题.经过各种百度和google,终于都解决了,现在来总结一下: 1.安装完redhat 5.4,安装gcc编译器的问题:这个gcc编译器需要 ...