胡海斌
摘要:Lucene是由Apache軟件基金會支持與提供,它源代碼開放并可免費使用,支持純Java開發(fā)的一個全文搜索引擎開發(fā)工具包,它提供了強大的查詢引擎、索引引擎、文本分析引擎等應用程序接口,該文實現(xiàn)了其在全文檢索中多種方式的排序應用,并在項目開發(fā)中得到了較好的呈現(xiàn)。
關(guān)鍵詞:Lucene;Java;全文檢索;排序
中圖分類號:TP311 文獻標識碼:A 文章編號: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軟件基金會支持與提供,最新版本為5.2.1,它源代碼開放并可免費使用,支持純Java開發(fā)的一個全文搜索引擎開發(fā)工具包,它提供了強大的查詢引擎、索引引擎、文本分析引擎等應用程序接口[1]。Lucene憑借良好的性能、優(yōu)異的索引結(jié)構(gòu)和易于擴展的特性的在實際的項目開發(fā)中得到越來越多的應用[2]。
對檢索結(jié)果排序是搜索引擎中必不可少的功能,也直接影響用戶的體驗度,在Lucene中默認是按評分及相關(guān)度進行排序,然而,在全文檢索的項目開發(fā)中,有時也需要按照如:文件名、文件類型、文件創(chuàng)建日期、文件大小等其它方式排序。本文在研究分析Lucene排序功能基礎(chǔ)之上,以磁盤上的文件檢索為例,設(shè)計并實現(xiàn)了基于Lucene的多種排序方式的應用。
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],這些方法通過給定不同的Sort類型實例(對象)以滿足不同的排序需求。Sort類型實例由Sort類和SortField類共同完成,兩者的類圖如圖2所示。在Sort類中可以通過構(gòu)造函數(shù)或setSort函數(shù)設(shè)定排序字段和排序方式(升序或降序)。排序字段和方式可以直接由SortField構(gòu)造函數(shù)來完成,本文調(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是布爾型,表示排序為升序或降序。
2 功能設(shè)計
以檢索磁盤上的文件為例,假定已為其建立了全文索引,在索引中存儲的有文件的標題、類型、創(chuàng)建日期、大小、頁數(shù)、存放路徑等信息,要求能檢索其相關(guān)信息,檢索結(jié)果并能按指定的段升序或降序排列。為此,設(shè)計用于保存或獲取文件信息的FileInfo類,其類圖描述如圖3所示:
設(shè)計CustomSort類,其類圖如圖4所示,在類中用getProperty方法實現(xiàn)對給定類的屬性名及類型的遍歷,其結(jié)果以HashMap類型方式保存,用getSort方法實現(xiàn)對給定字段和排序方式的Sort對象的返回,后續(xù)開發(fā)中可以調(diào)用search(Query query, int n, Sort sort)方法以實現(xiàn)多種方式的自定義排序。
3 具體實現(xiàn)
3.1 關(guān)鍵代碼
本文略去Lucene所需開發(fā)環(huán)境的部署說明和編程環(huán)境的配置,其實現(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)這個類的所有信息都存放到對象c中
Class<?> c = Class.forName(classPath);
// 把屬性的信息提取出來,并且存放到field類的對象中,因為每個field的對象只能存放一個屬性的信息所以要用數(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)代碼在具體項目中應用結(jié)果如圖5所示,既能實現(xiàn)按
照默認的相關(guān)度排序,也能根據(jù)需要選擇按照文件大小、創(chuàng)建日期、文件類型、文件名稱等多種方式排序,圖5展示了對全文檢索結(jié)果按文件大小采用排列的效果。
4 結(jié)論
本文針對全文檢索中多種排序方式的應用需求,展示了其關(guān)鍵代碼和項目中實現(xiàn)的效果,為程序開發(fā)人員提供一定的參考。
參考文獻:
[1] 管建和,甘劍峰.基于Lucene全文檢索引擎的應用研究與實現(xiàn)[J].計算機工程與設(shè)計,2007(2):489-491.
[2] 周登朋,謝康林.Lucene搜索引擎[J].計算機工程,2007(18):95-96+118.
[3] Apache.Lucene 5.2.1 core API[EB/OL].[2015-07-16].http://lucene.apache.org/.