szhswl
          宋針還的個人空間
                  參考了springside的代碼實現了高亮,其實也是很簡單的。在原來的searchController里面用的是默認的CompassSearchHelper來搜索的。
           1         if (searchHelper == null) {
           2             searchHelper = new CompassSearchHelper(getCompass(), getPageSize());
           3         }
           4         CompassSearchCommand searchCommand = new CompassSearchCommand();
           5         searchCommand.setPage(new Integer(currentPage-1));
           6         searchCommand.setQuery(query);
           7         ModelAndView mv = new ModelAndView();
           8         mv.addObject("query", query);
           9         mv.addObject("p", currentPage);
          10         List<String> errors = new ArrayList<String>();
          11         try{
          12             CompassSearchResults searchResults = searchHelper.search(searchCommand);
          13             mv.addObject(getSearchResultsName(), searchResults);
          14         }catch (SearchEngineQueryParseException ex){
          15             errors.add(TextUtil.escapeHTML(ex.getMessage()));
          16             mv.addObject("errors", errors);
          17         } 
          18 
          本來打算按照springside里面的封裝方法。
          http://svn.javascud.org/svn/springside/springside2/trunk/core/src/java/org/springside/components/compass/
          這里有兩個類AdvancedSearchCommand.java,CompassSearchService.java,CompassSearchService里面實現了高亮和排序,后來發現CompassSearchService和CompassSearchHelper長得很像,而且CompassSearchHelper也提供了兩個抽象的方法給用戶提供一個添加功能的機會。

           1     /**
           2      * An option to perform any type of processing before the hits are detached.
           3      */
           4     protected void doProcessBeforeDetach(CompassSearchCommand searchCommand, CompassSession session, CompassHits hits,
           5                                          int from, int size) {
           6 
           7     }
           8 
           9     /**
          10      * An option to perform any type of processing after the hits are detached.
          11      */
          12     protected void doProcessAfterDetach(CompassSearchCommand searchCommand, CompassSession session,
          13                                         CompassDetachedHits hits) {
          14 
          15     } 
          16 
          所以我們只要實現一個自己的CompassSearchHelper覆蓋這兩個方法就可以達到實現高亮的目的了。
           1 /**
           2  * @author <a href="mailto:rory.cn@gmail.com">somebody</a>
           3  * @since Aug 23, 2007 2:04:19 PM
           4  * @version $Id AdvanceCompassSearchHelper.java$
           5  */
           6 public class AdvanceCompassSearchHelper extends CompassSearchHelper {
           7 
           8     private String[] highlightFields;
           9 
          10     public String[] getHighlightFields() {
          11         return highlightFields;
          12     }
          13 
          14     public void setHighlightFields(String[] highlightFields) {
          15         this.highlightFields = highlightFields;
          16     }
          17 
          18     /**
          19      * @param compass
          20      */
          21     public AdvanceCompassSearchHelper(Compass compass) {
          22         super(compass);
          23     }
          24     
          25 
          26     /* (non-Javadoc)
          27      * @see org.compass.core.support.search.CompassSearchHelper#doProcessBeforeDetach(org.compass.core.support.search.CompassSearchCommand, org.compass.core.CompassSession, org.compass.core.CompassHits, int, int)
          28      */
          29     @Override
          30     protected void doProcessBeforeDetach(CompassSearchCommand searchCommand,
          31             CompassSession session, CompassHits hits, int from, int size) {
          32         if (from < 0) {
          33             from = 0;
          34             size = hits.getLength();
          35         }
          36 
          37         if (highlightFields == null) {
          38             return;
          39         }
          40         // highlight fields
          41         for (int i = from; i < size; i++) {
          42             for (String highlightField : highlightFields) {
          43                 hits.highlighter(i).fragment(highlightField);
          44             }
          45         }
          46     } 
          47 
          ok,這樣就可以實現高亮了。修改一下SearchController的配置。
           1     <bean id="advanceCompassSearchHelper" class="com.jdkcn.compass.AdvanceCompassSearchHelper">
           2         <property name="highlightFields">
           3             <list>
           4                 <value>content</value>
           5             </list>
           6         </property>
           7         <property name="pageSize"><value>10</value></property>
           8         <constructor-arg ref="compass"/>
           9     </bean>
          10      
          11     <bean id="searchController" class="com.jdkcn.web.SearchController" parent="baseController">
          12         <property name="compass"><ref bean="compass"/></property>
          13         <property name="searchView"><value>search</value></property>
          14         <property name="searchResultsView"><value>search</value></property>
          15         <property name="pageSize"><value>10</value></property>
          16         <property name="searchHelper"><ref local="advanceCompassSearchHelper"/></property>
          17     </bean> 
          18 
          還不要忘了修改一下compass settings 修改一下高亮的樣式,修改一下高亮的顏色。
           1     <bean id="compass" class="org.compass.spring.LocalCompassBean">
           2         <property name="resourceDirectoryLocations">
           3             <list>
           4                 <value>classpath:com/jdkcn/compass</value>
           5             </list>
           6         </property>
           7         <property name="connection">
           8             <value>/lucene/indexes</value>
           9         </property>
          10         <property name="compassSettings">
          11             <props>
          12                 <prop key="compass.transaction.factory">
          13                     org.compass.spring.transaction.SpringSyncTransactionFactory
          14                 </prop>
          15                 <prop key="compass.engine.highlighter.default.formatter.simple.pre">
          16                     <![CDATA[<font color="red"><b>]]>
          17                 </prop>
          18                 <prop key="compass.engine.highlighter.default.formatter.simple.post">
          19                     <![CDATA[</b></font>]]>
          20                 </prop>
          21             </props>
          22         </property>
          23         <property name="transactionManager">
          24             <ref bean="transactionManager" />
          25         </property>
          26     </bean> 
          27 
          ok了,頁面上輸出一下就能看到最終效果了${hit.highlightedText['content']?if_exists}

          本文轉自:http://jdkcn.com/entry/howto-add-highlight-in-compass.html



          ---------------------------------------------------------------------------------------------------------------------------------
          說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
          http://www.aygfsteel.com/szhswl
          ------------------------------------------------------------------------------------------------------ ----------------- ---------
          posted on 2007-12-12 20:39 宋針還 閱讀(1775) 評論(2)  編輯  收藏 所屬分類: 搜索引擎

          FeedBack:
          # re: 給Compass搜索添加高亮(highlight)
          2008-01-12 13:56 | buffon
          for (int i = from; i < size; i++) {
          for (String highlightField : highlightFields) {
          hits.highlighter(i).fragment(highlightField);
          }
          }

          應該是下面這樣吧?
          for (int i = from; i < from+size; i++) {
          for (String highlightField : highlightFields) {
          hits.highlighter(i).fragment(highlightField);
          }
          }
            回復  更多評論
            
          # re: 給Compass搜索添加高亮(highlight)
          2009-04-07 15:11 | dongzai
          當然不是這樣 size是什么你沒搞清楚@buffon
            回復  更多評論
            
          主站蜘蛛池模板: 共和县| 内丘县| 宁明县| 昭平县| 英德市| 易门县| 中西区| 合阳县| 聂荣县| 永德县| 盐津县| 浮梁县| 通化县| 三原县| 安仁县| 海宁市| 襄汾县| 广饶县| 中西区| 许昌市| 中宁县| 临猗县| 博爱县| 渭源县| 定陶县| 剑阁县| 兴海县| 山西省| 内江市| 波密县| 岐山县| 凯里市| 贺兰县| 温泉县| 类乌齐县| 深水埗区| 康乐县| 济源市| 仁化县| 桦南县| 安达市|