需求: 在lucene索引中建立了很多關(guān)鍵字的索引,想獲得一個當(dāng)前用戶的關(guān)鍵字列表,并且每個關(guān)鍵字還帶有使用了多少次的信息。
解決方法:
使用自定義的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,都會調(diào)用這個方法的collect方法,因此可以在這個對象當(dāng)中放一個HashMap,累計(jì)記錄每個關(guān)鍵字得到的次數(shù)。
排序部分用另外的一個TagSummary類來獲得,這里就不詳細(xì)給出了。
問題: 這是一個直觀的方法,但是相信頻繁調(diào)用這樣的方法會造成服務(wù)器的嚴(yán)重負(fù)擔(dān)??梢钥紤]一下用緩存的方法,在沒有關(guān)鍵字未曾發(fā)生改變之前,只在第一次調(diào)用這樣的方法,之后把結(jié)果緩存在數(shù)據(jù)表或者內(nèi)存當(dāng)中。有更新的時候,通過版本號對比以決定是否需要更新。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。