Lucene搜索实现过程细节.doc
文本预览下载声明
lucene搜索实现过程详解
郭玉璞 2008-05-05
文档说明
关于lucene索引生成过程和生成文件结构,在《关于lucene建立索引的详细过程及相关文件结构》一文中已经说明,本文涉及到的文件结构,请参考该文档,这里不再累赘,并且我们假设您已经对索引文件格式有了一定的了解。
为了对搜索的实现过程有一个清晰的认识,本文采用分级的形势,层层深入。
对于分词这一块,将有专题讲解,本文在不影响理解的情况下,没有详解。
搜索过程简介
索引的过程主要分为以下几个步骤:
打开索引文件,并将索引文件的相关信息读入。代码如下:
IndexReader reader = IndexReader.Open(index);
其中,index为索引文件所在的文件夹名称。该句执行完以后,索引文件的相关信息将存放在reader中。
实例化IndexSearcher,以便于后面的搜索操作。代码如下:
IndexSearcher searcher = new IndexSearcher(reader);
该句执行完后,索引文件信息将存放在searcher中,后面的的搜索将运用searcher,而不是运用reader。当然,初始化方式有很多种,这里就以代码所示为例。
声明查询分析器QueryPaser。代码如下:
QueryParser parser = new QueryParser(field, analyzer);
其中,field为要查询的字段,analyzer为所选择的分析器。
设置Query间的逻辑关系。代码如下:
parser.SetDefaultOperator(QueryParser.Operator.AND);
该句的功能是,如果用户以空格隔开两个字符串,设置这两个字符串之间的关系,代码所示的是与的关系,根据需要也可以设置成OR等关系。此句可有可无,Lucene默认的是OR的关系。
生成Query子对象。代码如下:
Query query = parser.Parse(strQuery);
其中,strQuery为用户输入的待查询的字符串。该句的主要功能是将用户输入的字符串进行分词,并记录每个Token之间的位置关系,以便于后面的查询。
当然,Lucene允许用户直接创建Query,也允许用户采用多种方法构建Query。例如:按词条搜索—TermQuery、“与或”搜索—BooleanQuery、在某一范围内搜索—RangeQuery、使用前缀搜索—PrefixQuery、多关键字的搜索—PhraseQuery、使用短语缀搜索—PhrasePrefixQuery、相近词语的搜索—FuzzyQuery、使用通配符搜索—WildcardQuery。各种方法原理相同,都是将各单个Query搜索,然后再将各自结果按照“与”或者“或”的关系得出最终结果。在本文中,我们将以代码所示的简单方式为例。
搜索,返回处理结果。代码如下:
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。
其
显示全部