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筆記 閱讀(1747) 評論(0)  編輯  收藏 所屬分類: Java
           
          主站蜘蛛池模板: 尖扎县| 丁青县| 且末县| 伊金霍洛旗| 长汀县| 五原县| 丽江市| 富阳市| 象山县| 托克逊县| 扎赉特旗| 云和县| 和龙市| 宜州市| 谷城县| 灌阳县| 阿坝| 湘西| 富宁县| 宁明县| 蒙城县| 伊金霍洛旗| 虞城县| 阿尔山市| 正宁县| 荣昌县| 开原市| 河北区| 平邑县| 贡山| 阳春市| 苗栗市| 英吉沙县| 贵德县| 兴义市| 城步| 北宁市| 万山特区| 张北县| 安顺市| 南昌县|