没有合适的资源?快使用搜索试试~ 我知道了~
lucene搜索过程代码详解
4星 · 超过85%的资源 需积分: 9 34 下载量 144 浏览量
2008-10-21
13:16:31
上传
评论
收藏 84KB DOC 举报
温馨提示
试读
12页
详细分析lucene搜索的实现过程,通过代码解析,会对lucene的搜索实现过程有一个更加深刻的认识
资源推荐
资源详情
资源评论
lucene 搜索实现过程详解
郭玉璞 2008-05-05
一. 文档说明
1. 关于 lucene 索引生成过程和生成文件结构,在《关于 lucene 建立索引的详
细过程及相关文件结构》一文中已经说明,本文涉及到的文件结构,请参考
该文档,这里不再累赘,并且我们假设您已经对索引文件格式有了一定的了
解。
2. 为了对搜索的实现过程有一个清晰的认识,本文采用分级的形势,层层深
入。
3. 对于分词这一块,将有专题讲解,本文在不影响理解的情况下,没有详解。
二. 搜索过程简介
索引的过程主要分为以下几个步骤:
1. 打开索引文件,并将索引文件的相关信息读入。代码如下:
IndexReader reader = IndexReader.Open("index");
其中,index 为索引文件所在的文件夹名称。该句执行完以后,索引文件的相
关信息将存放在 reader 中。
2. 实例化 IndexSearcher,以便于后面的搜索操作。代码如下:
IndexSearcher searcher = new IndexSearcher(reader);
该句执行完后,索引文件信息将存放在 searcher 中,后面的的搜索将运用
searcher,而不是运用 reader。当然,初始化方式有很多种,这里就以代码所示
为例。
3. 声明查询分析器 QueryPaser。代码如下:
QueryParser parser = new QueryParser(field, analyzer);
其中,field 为要查询的字段,analyzer 为所选择的分析器。
4. 设置 Query 间的逻辑关系。代码如下:
parser.SetDefaultOperator(QueryParser.Operator.AND);
该句的功能是,如果用户以空格隔开两个字符串,设置这两个字符串之间的
关系,代码所示的是与的关系,根据需要也可以设置成 OR 等关系。此句可有
可无,Lucene 默认的是 OR 的关系。
5. 生成 Query 子对象。代码如下:
Query query = parser.Parse(strQuery);
其中,strQuery 为用户输入的待查询的字符串。该句的主要功能是将用户输
入的字符串进行分词,并记录每个 Token 之间的位置关系,以便于后面的查询。
当然,Lucene 允许用户直接创建 Query,也允许用户采用多种方法构建
Query。例如:按词条搜索—TermQuery、“与或”搜索—BooleanQuery、在某一范
围内搜索— RangeQuery 、使用前缀 搜索— PrefixQuery 、多关键字的搜索 —
PhraseQuery 、 使 用 短 语 缀 搜 索 — PhrasePrefixQuery 、 相 近 词 语 的 搜 索 —
FuzzyQuery、使用通配符搜索—WildcardQuery。各种方法原理相同,都是将各
单个 Query 搜索,然后再将各自结果按照“与”或者“或”的关系得出最终结果。在
本文中,我们将以代码所示的简单方式为例。
6. 搜索,返回处理结果。代码如下:
Hits hits = searcher.Search(query);
在该句中,不仅涉及搜索的过程,而且还有排序、过滤等过程。
7.根据搜索生成的内部编号,返回真正的结果。代码如下:
Document doc = hits.Doc(i);
三. 搜索过程详解。
1.IndexReader reader = IndexReader.Open("index");该句调用 IndexReader 的
Open 方法:
public static IndexReader Open(System.String path)
{
return Open(FSDirectory.GetDirectory(path, false), true);
}
1.1 FSDirectory.GetDirectory(path,false),该方法获取索引文件夹的完全路径
和创建临时文件路径。其中,path 为索引文件所在文件夹的名称,false 表示不
要创建新的文件夹。该方法调用 FSDirectory 的 GetDirectory 方法:
public static FSDirectory GetDirectory(System.String path, bool create)
{
return GetDirectory(new System.IO.FileInfo(path), create);
}
1.1.1 GetDirectory(new System.IO.FileInfo(path), create);该方法是获取文夹完
整路径的核心方法,其他方法都调用此方法。
首先,通过语句 file = new System.IO.FileInfo(file.FullName);获得索引文件
所在文件夹的完整路径到 file。
其次,根据 file 创建临时文件将要存放的路径:
FSDirectory dir;
dir = (FSDirectory) DIRECTORIES[*le];
dir = (FSDirectory) System.Activator.CreateInstance(IMPL);
然后,进行初始化工作:dir.Init(file, create);由于现在是搜索过程,并非创
建索引的过程,初始化工作只是将两个完整路径传给 dir。
最后,返回 dir。
1.2 Open(FSDirectory.GetDirectory(path, false), true);该方法调用 IndexReader 的
Open(Directory directory, bool closeDirectory)方法。其中,directroy 就是上面返
回 的 dir 。 在 该 方 法 中 , 有 三 个 主 要 方 法
MakeLock、AnonymousClassWith、Run()。
1 . 2 . 1 directory.MakeLock(IndexWriter.COMMIT_LOCK_NAME) ; 其 中
COMMIT_LOCK_NAME 为锁文件名,在 Lucene 中为 commit.lock。此刻该文件
表示有进程在读“segment”文件和打开某些段的文件。在该方法中,首先获取索
引文件目录的前缀,并以此来命名锁文件名称;然后将临时文件夹的完整路径
和 锁 文 件 名 称 组 成 完 整 了 锁 文 件 名 称 LockFile ; 最 后 初 始 化 该 锁 :
AnonymousClassLock(lockFile, this);其中 this 为当前索引文件目录路径。
1 . 2 . 2 AnonymousClassWith(directory, closeDirectory,
directory.MakeLock(IndexWriter.COMMIT_LOCK_NAME),
IndexWriter.COMMIT_LOCK_TIMEOUT);该方法主要做一些初始化工作。其
中,COMMIT_LOCK_NAME 为获取锁文件的限定时间,Lucene 默认时间为
10000 毫秒。
剩余11页未读,继续阅读
资源评论
- zym8209102013-02-22还不错,只是文档有点简单了点
- hit20072013-01-07对初学者有一定的帮助
gyplayer
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功