Raymond
Java笔记
需求: 在lucene索引中建立了很多关键字的索引,想获得一个当前用户的关键字列表,并且每个关键字还带有使用了多少次的信息。

解决方法:
使用自定义的HitCollector对象,代码如下
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.apache.lucene.document.Document;
import org.apache.lucene.search.HitCollector;
import org.apache.lucene.search.IndexSearcher;

public class TagCollector extends HitCollector {
    
private IndexSearcher searcher;
    
private HashMap<String,Integer> tagList=new HashMap<String,Integer>();
    
public TagCollector(IndexSearcher searcher) {
        
this.searcher=searcher;
    }

    @Override
    
public void collect(int docID, float score) {
        
try {
            Document doc
=searcher.doc(docID);
            String[] tagValues
=doc.getValues("tag");
            
if (tagValues!=null{
                
for (int i=0;i<tagValues.length;i++{
                    addTagCount(tagValues[i]);
                }

            }

        }
 catch (IOException e) {
            e.printStackTrace();
        }


    }

    
    
private void addTagCount(String tagName) {
        
int count=1;
        
if (tagList.containsKey(tagName)) {
            count
=(Integer)tagList.get(tagName)+1;
        }

        tagList.put(tagName,count);
    }

    
    
public HashMap<String,Integer> getTagList() {
        
return tagList;
    }

    
    @SuppressWarnings(
"unchecked")
    
public ArrayList<TagSummary> getSortedTagList(boolean ascending) {
        ArrayList
<TagSummary> list=new ArrayList<TagSummary>();
        Iterator keyIterator
=tagList.keySet().iterator();
        
while (keyIterator.hasNext()) {
            String key
=(String)keyIterator.next();
            
int value=tagList.get(key);
            list.add(
new TagSummary(key,value));
        }

        Collections.sort(list);
        
if (!ascending) {
            Collections.reverse(list);
        }

        
return list;
    }

    

}

功能说明: 每个搜索到的hits,都会调用这个方法的collect方法,因此可以在这个对象当中放一个HashMap,累计记录每个关键字得到的次数。

排序部分用另外的一个TagSummary类来获得,这里就不详细给出了。

问题: 这是一个直观的方法,但是相信频繁调用这样的方法会造成服务器的严重负担。可以考虑一下用缓存的方法,在没有关键字未曾发生改变之前,只在第一次调用这样的方法,之后把结果缓存在数据表或者内存当中。有更新的时候,通过版本号对比以决定是否需要更新。
posted on 2006-02-04 14:26 Raymond的Java笔记 阅读(1718) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: