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.blogjava.net/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------
posted on 2007-12-12 20:39 宋针还 阅读(1751) 评论(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
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: