Lucene查询结果Hits的二次封装

原文发布在:http://paomadeng.javaeye.com/blog/126687

OSPod.Forum使用Lucene作为搜索引擎核心,对于Lucene的分页,OSPod对Hits进行了二次封装,取出所需结果集后,关闭Hits,极大提高搜索效率。参考代码如下:

 

 

/**
     * 索引分页对象
     
*/
    
private Pagination page;
    
/**
     * 命中结果数据数
     
*/
    
private int hitsLength = 0;
    
/**
     * 当前分页的命中结果集
     
*/
    
private List results;
    
/**
     * 用于分页的最大结果数
     
*/
    
private int total = 0;
    
    
/**
     * 构造方法,创建并初始化索引结果集对象
     * 
@param hits 查询命中结果
     * 
@param start  结果集提取其实位置
     * 
@param count  当前提取数
     * 
@param totalLimit  用于分页的最大结果集数,限制提取的最大结果数有利于提供系统查询性能
     
*/
    
public IndexResultSet(Hits hits, int start, int count, int totalLimit){
        results 
= new ArrayList();
        page 
= PaginationUtils.create();
        hitsLength 
= hits.length();
        
if(hitsLength > totalLimit){
            total 
= totalLimit;
        }
else{
            total 
= hitsLength;
        }
        
int pageSize = count;
        
if(start + count > total){
            count 
= total - start;
        }
        page.init( start, count, total, pageSize );
        
int end = start + count;
        
try{
            Document doc;
            
for (int i = start; i < end; i++) {
                doc 
= hits.doc( i );
                Iterator iter 
= doc.getFields().iterator();
                EMap data 
= new EMap();
                String name, value, lvalue;
                
while(iter.hasNext()){
                    Field f 
= (Field)iter.next();
                    name 
= f.name();
                    value 
= doc.get(name);
                    data.setValue( name, value );
                }
                data.setValue( 
"score__", hits.score( i ) );
                data.setValue( 
"docid__", hits.id( i ) );
                results.add( data );
            }
        }
catch(IOException ex){
            
throw new IndexException("索引结果集获取出错", ex);
        }
    }
阅读更多
文章标签: lucene 搜索引擎
上一篇是先对搜索词进行中文分词呢?还是在搜索过程中进行中文分词?
下一篇OSPod.Forum 先睹为快
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭