Raymond
          Java筆記
          需求: 在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,累計記錄每個關(guān)鍵字得到的次數(shù)。

          排序部分用另外的一個TagSummary類來獲得,這里就不詳細給出了。

          問題: 這是一個直觀的方法,但是相信頻繁調(diào)用這樣的方法會造成服務(wù)器的嚴重負擔(dān)。可以考慮一下用緩存的方法,在沒有關(guān)鍵字未曾發(fā)生改變之前,只在第一次調(diào)用這樣的方法,之后把結(jié)果緩存在數(shù)據(jù)表或者內(nèi)存當(dāng)中。有更新的時候,通過版本號對比以決定是否需要更新。
          posted on 2006-02-04 14:26 Raymond的Java筆記 閱讀(1741) 評論(0)  編輯  收藏 所屬分類: Java
           
          主站蜘蛛池模板: 大丰市| 桂林市| 高要市| 巴中市| 松滋市| 华容县| 凤山县| 宁安市| 喀什市| 九台市| 延寿县| 祁门县| 桐庐县| 如皋市| 翁牛特旗| 诸暨市| 昌平区| 平乡县| 榆林市| 井研县| 池州市| 台北市| 普兰县| 胶南市| 阿荣旗| 息烽县| 铜山县| 怀安县| 安陆市| 丹凤县| 霍邱县| 济源市| 西和县| 佛冈县| 西贡区| 历史| 德清县| 济宁市| 湘乡市| 舟曲县| 云南省|