APP下载

基于Lucene的多种排序方式的实现

2015-09-11胡海斌

电脑知识与技术 2015年17期
关键词:全文检索排序

胡海斌

摘要:Lucene是由Apache软件基金会支持与提供,它源代码开放并可免费使用,支持纯Java开发的一个全文搜索引擎开发工具包,它提供了强大的查询引擎、索引引擎、文本分析引擎等应用程序接口,该文实现了其在全文检索中多种方式的排序应用,并在项目开发中得到了较好的呈现。

关键词: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开发的一个全文搜索引擎开发工具包,它提供了强大的查询引擎、索引引擎、文本分析引擎等应用程序接口[1]。Lucene凭借良好的性能、优异的索引结构和易于扩展的特性的在实际的项目开发中得到越来越多的应用[2]。

对检索结果排序是搜索引擎中必不可少的功能,也直接影响用户的体验度,在Lucene中默认是按评分及相关度进行排序,然而,在全文检索的项目开发中,有时也需要按照如:文件名、文件类型、文件创建日期、文件大小等其它方式排序。本文在研究分析Lucene排序功能基础之上,以磁盘上的文件检索为例,设计并实现了基于Lucene的多种排序方式的应用。

1 Lucene中的排序功能

Lucene系统结构与源码组织结构如图1所示,与查询有关的源码主要集中在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类中可以通过构造函数或setSort函数设定排序字段和排序方式(升序或降序)。排序字段和方式可以直接由SortField构造函数来完成,本文调用的是SortField(field : String, type : int, reverse : boolean)构造函数,该构造函数中field为字符串型,表示排序字段名;type是整型,表示排序字段的类型(如:INT为4,表示int型,FLOAT为5,表示float型等等);reverse是布尔型,表示排序为升序或降序。

2 功能设计

以检索磁盘上的文件为例,假定已为其建立了全文索引,在索引中存储的有文件的标题、类型、创建日期、大小、页数、存放路径等信息,要求能检索其相关信息,检索结果并能按指定的段升序或降序排列。为此,设计用于保存或获取文件信息的FileInfo类,其类图描述如图3所示:

设计CustomSort类,其类图如图4所示,在类中用getProperty方法实现对给定类的属性名及类型的遍历,其结果以HashMap类型方式保存,用getSort方法实现对给定字段和排序方式的Sort对象的返回,后续开发中可以调用search(Query query, int n, Sort sort)方法以实现多种方式的自定义排序。

3 具体实现

3.1 关键代码

本文略去Lucene所需开发环境的部署说明和编程环境的配置,其实现多种方式自定义排序的关键代码如下:

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 getProperty(String classPath) throws Exception {

HashMap fieldHashMap = new HashMap();

// 把要使用的类加载到内存中,并且把有关这个类的所有信息都存放到对象c中

Class<?> c = Class.forName(classPath);

// 把属性的信息提取出来,并且存放到field类的对象中,因为每个field的对象只能存放一个属性的信息所以要用数组去接收

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 = new 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 效果展示

相关代码在具体项目中应用结果如图5所示,既能实现按

照默认的相关度排序,也能根据需要选择按照文件大小、创建日期、文件类型、文件名称等多种方式排序,图5展示了对全文检索结果按文件大小采用排列的效果。

4 结论

本文针对全文检索中多种排序方式的应用需求,展示了其关键代码和项目中实现的效果,为程序开发人员提供一定的参考。

参考文献:

[1] 管建和,甘剑峰.基于Lucene全文检索引擎的应用研究与实现[J].计算机工程与设计,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/.

猜你喜欢

全文检索排序
排序不等式
恐怖排序
Oracle数据库全文检索性能研究
基于KySou的全文检索系统的分析与优化
用JSP调用Lucene包来实现全文检索