胡海斌
摘要:Lucene是由Apache軟件基金會(huì)支持與提供,它源代碼開(kāi)放并可免費(fèi)使用,支持純Java開(kāi)發(fā)的一個(gè)全文搜索引擎開(kāi)發(fā)工具包,它提供了強(qiáng)大的查詢引擎、索引引擎、文本分析引擎等應(yīng)用程序接口,該文實(shí)現(xiàn)了其在全文檢索中多種方式的排序應(yīng)用,并在項(xiàng)目開(kāi)發(fā)中得到了較好的呈現(xiàn)。
關(guān)鍵詞:Lucene;Java;全文檢索;排序
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)17-0054-02
The Implementation of a Variety of Sorting Methods Based on Lucene
HU Hai-bin
(Experiment Center, China West Normal University, Nanchong 637002, China)
Abstract: Lucene which is open source and free is supported and provided by the Apache Software Foundation. It supports full-text search engine of pure Java development kit, which provides a powerful query engine, indexing engine, text analysis engine and other applications Interface. the paper achieved a variety of sorting methods in the full-text search, and get a better showing in project development.
Key words: Lucene; Java; full-text retrieval; sor
Lucene是由Apache軟件基金會(huì)支持與提供,最新版本為5.2.1,它源代碼開(kāi)放并可免費(fèi)使用,支持純Java開(kāi)發(fā)的一個(gè)全文搜索引擎開(kāi)發(fā)工具包,它提供了強(qiáng)大的查詢引擎、索引引擎、文本分析引擎等應(yīng)用程序接口[1]。Lucene憑借良好的性能、優(yōu)異的索引結(jié)構(gòu)和易于擴(kuò)展的特性的在實(shí)際的項(xiàng)目開(kāi)發(fā)中得到越來(lái)越多的應(yīng)用[2]。
對(duì)檢索結(jié)果排序是搜索引擎中必不可少的功能,也直接影響用戶的體驗(yàn)度,在Lucene中默認(rèn)是按評(píng)分及相關(guān)度進(jìn)行排序,然而,在全文檢索的項(xiàng)目開(kāi)發(fā)中,有時(shí)也需要按照如:文件名、文件類型、文件創(chuàng)建日期、文件大小等其它方式排序。本文在研究分析Lucene排序功能基礎(chǔ)之上,以磁盤上的文件檢索為例,設(shè)計(jì)并實(shí)現(xiàn)了基于Lucene的多種排序方式的應(yīng)用。
1 Lucene中的排序功能
Lucene系統(tǒng)結(jié)構(gòu)與源碼組織結(jié)構(gòu)如圖1所示,與查詢有關(guān)的源碼主要集中在org.apache.lucene.search包中,在該包中的IndexSearcher類提供了search(Query query, int n, Sort sort)、search(Query query, Filter filter, int n, Sort sort)等方法[3],這些方法通過(guò)給定不同的Sort類型實(shí)例(對(duì)象)以滿足不同的排序需求。Sort類型實(shí)例由Sort類和SortField類共同完成,兩者的類圖如圖2所示。在Sort類中可以通過(guò)構(gòu)造函數(shù)或setSort函數(shù)設(shè)定排序字段和排序方式(升序或降序)。排序字段和方式可以直接由SortField構(gòu)造函數(shù)來(lái)完成,本文調(diào)用的是SortField(field : String, type : int, reverse : boolean)構(gòu)造函數(shù),該構(gòu)造函數(shù)中field為字符串型,表示排序字段名;type是整型,表示排序字段的類型(如:INT為4,表示int型,F(xiàn)LOAT為5,表示float型等等);reverse是布爾型,表示排序?yàn)樯蚧蚪敌颉?/p>
2 功能設(shè)計(jì)
以檢索磁盤上的文件為例,假定已為其建立了全文索引,在索引中存儲(chǔ)的有文件的標(biāo)題、類型、創(chuàng)建日期、大小、頁(yè)數(shù)、存放路徑等信息,要求能檢索其相關(guān)信息,檢索結(jié)果并能按指定的段升序或降序排列。為此,設(shè)計(jì)用于保存或獲取文件信息的FileInfo類,其類圖描述如圖3所示:
設(shè)計(jì)CustomSort類,其類圖如圖4所示,在類中用getProperty方法實(shí)現(xiàn)對(duì)給定類的屬性名及類型的遍歷,其結(jié)果以HashMap類型方式保存,用getSort方法實(shí)現(xiàn)對(duì)給定字段和排序方式的Sort對(duì)象的返回,后續(xù)開(kāi)發(fā)中可以調(diào)用search(Query query, int n, Sort sort)方法以實(shí)現(xiàn)多種方式的自定義排序。
3 具體實(shí)現(xiàn)
3.1 關(guān)鍵代碼
本文略去Lucene所需開(kāi)發(fā)環(huán)境的部署說(shuō)明和編程環(huán)境的配置,其實(shí)現(xiàn)多種方式自定義排序的關(guān)鍵代碼如下:
package cn.cwnu.sort;
import java.lang.reflect.Field;
import java.util.HashMap;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
public class CustomSort {
private HashMap
HashMap
// 把要使用的類加載到內(nèi)存中,并且把有關(guān)這個(gè)類的所有信息都存放到對(duì)象c中
Class<?> c = Class.forName(classPath);
// 把屬性的信息提取出來(lái),并且存放到field類的對(duì)象中,因?yàn)槊總€(gè)field的對(duì)象只能存放一個(gè)屬性的信息所以要用數(shù)組去接收
Field f[] = c.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
//屬性的名字,屬性的類型
fieldHashMap.put(f[i].getName(), f[i].getType());
}
return fieldHashMap;
}
private Sort getSort(String sortFieldName, boolean sortMethod) throws Exception {
HashMap
fieldHashMap = getProperty("cn.cwnu.lucene.file.bo.FileInfo");
String fieldType = fieldHashMap.get(sortFieldName).toString();
if (fieldType == null) {
System.out.println("指定的排序字段不存在");
return null;
}
int sortType = 0;
if (fieldType.endsWith("int"))
sortType = SortField.INT;
if (fieldType.endsWith("String"))
sortType = SortField.STRING;
if (fieldType.endsWith("float"))
sortType = SortField.FLOAT;
if (fieldType.endsWith("double"))
sortType = SortField.DOUBLE;
Sort sort = new Sort();
SortField sortField = new SortField(sortFieldName, sortType, sortMethod);
sort.setSort(sortField);
return sort;
}
}
3.2 效果展示
相關(guān)代碼在具體項(xiàng)目中應(yīng)用結(jié)果如圖5所示,既能實(shí)現(xiàn)按
照默認(rèn)的相關(guān)度排序,也能根據(jù)需要選擇按照文件大小、創(chuàng)建日期、文件類型、文件名稱等多種方式排序,圖5展示了對(duì)全文檢索結(jié)果按文件大小采用排列的效果。
4 結(jié)論
本文針對(duì)全文檢索中多種排序方式的應(yīng)用需求,展示了其關(guān)鍵代碼和項(xiàng)目中實(shí)現(xiàn)的效果,為程序開(kāi)發(fā)人員提供一定的參考。
參考文獻(xiàn):
[1] 管建和,甘劍峰.基于Lucene全文檢索引擎的應(yīng)用研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007(2):489-491.
[2] 周登朋,謝康林.Lucene搜索引擎[J].計(jì)算機(jī)工程,2007(18):95-96+118.
[3] Apache.Lucene 5.2.1 core API[EB/OL].[2015-07-16].http://lucene.apache.org/.