需求: 在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类来获得,这里就不详细给出了。
问题: 这是一个直观的方法,但是相信频繁调用这样的方法会造成服务器的严重负担。可以考虑一下用缓存的方法,在没有关键字未曾发生改变之前,只在第一次调用这样的方法,之后把结果缓存在数据表或者内存当中。有更新的时候,通过版本号对比以决定是否需要更新。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。