`
nlslzf
  • 浏览: 1044707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给Compass搜索添加高亮(highlight)

阅读更多
http://jdkcn.com/entry/howto-add-highlight-in-compass.html
在myblog 1.5 P1版中我加入了Compass搜索的高亮支持。我参考了springside的代码实现了高亮,其实也是很简单的。在原来的searchController里面用的是默认的CompassSearchHelper来搜索的。
        if (searchHelper == null) {
            searchHelper = new CompassSearchHelper(getCompass(), getPageSize());
        }
        CompassSearchCommand searchCommand = new CompassSearchCommand();
        searchCommand.setPage(new Integer(currentPage-1));
        searchCommand.setQuery(query);
        ModelAndView mv = new ModelAndView();
        mv.addObject("query", query);
        mv.addObject("p", currentPage);
        List<String> errors = new ArrayList<String>();
        try{
            CompassSearchResults searchResults = searchHelper.search(searchCommand);
            mv.addObject(getSearchResultsName(), searchResults);
        }catch (SearchEngineQueryParseException ex){
            errors.add(TextUtil.escapeHTML(ex.getMessage()));
            mv.addObject("errors", errors);
        }

本来打算按照springside里面的封装方法。http://svn.javascud.org/svn/springside/springside2/trunk/core/src/java/org/springside/components/compass/
这里有两个类AdvancedSearchCommand.java,CompassSearchService.java,CompassSearchService里面实现了高亮和排序,后来发现CompassSearchService和CompassSearchHelper长得很像,而且CompassSearchHelper也提供了两个抽象的方法给用户提供一个添加功能的机会。

    /**
     * An option to perform any type of processing before the hits are detached.
     */
    protected void doProcessBeforeDetach(CompassSearchCommand searchCommand, CompassSession session, CompassHits hits,
                                         int from, int size) {

    }

    /**
     * An option to perform any type of processing after the hits are detached.
     */
    protected void doProcessAfterDetach(CompassSearchCommand searchCommand, CompassSession session,
                                        CompassDetachedHits hits) {

    }

所以我们只要实现一个自己的CompassSearchHelper覆盖这两个方法就可以达到实现高亮的目的了。
/**
* @author <a href="mailto:rory.cn@gmail.com">somebody</a>
* @since Aug 23, 2007 2:04:19 PM
* @version $Id AdvanceCompassSearchHelper.java$
*/
public class AdvanceCompassSearchHelper extends CompassSearchHelper {

    private String[] highlightFields;

    public String[] getHighlightFields() {
        return highlightFields;
    }

    public void setHighlightFields(String[] highlightFields) {
        this.highlightFields = highlightFields;
    }

    /**
     * @param compass
     */
    public AdvanceCompassSearchHelper(Compass compass) {
        super(compass);
    }
   

    /* (non-Javadoc)
     * @see org.compass.core.support.search.CompassSearchHelper#doProcessBeforeDetach(org.compass.core.support.search.CompassSearchCommand, org.compass.core.CompassSession, org.compass.core.CompassHits, int, int)
     */
    @Override
    protected void doProcessBeforeDetach(CompassSearchCommand searchCommand,
            CompassSession session, CompassHits hits, int from, int size) {
        if (from < 0) {
            from = 0;
            size = hits.getLength();
        }

        if (highlightFields == null) {
            return;
        }
        // highlight fields
        for (int i = from; i < size; i++) {
            for (String highlightField : highlightFields) {
                hits.highlighter(i).fragment(highlightField);
            }
        }
    }

ok,这样就可以实现高亮了。修改一下SearchController的配置。
    <bean id="advanceCompassSearchHelper" class="com.jdkcn.compass.AdvanceCompassSearchHelper">
        <property name="highlightFields">
            <list>
                <value>content</value>
            </list>
        </property>
        <property name="pageSize"><value>10</value></property>
        <constructor-arg ref="compass"/>
    </bean>
    
    <bean id="searchController" class="com.jdkcn.web.SearchController" parent="baseController">
        <property name="compass"><ref bean="compass"/></property>
        <property name="searchView"><value>search</value></property>
        <property name="searchResultsView"><value>search</value></property>
        <property name="pageSize"><value>10</value></property>
        <property name="searchHelper"><ref local="advanceCompassSearchHelper"/></property>
    </bean>

还不要忘了修改一下compass settings 修改一下高亮的样式,修改一下高亮的颜色。
    <bean id="compass" class="org.compass.spring.LocalCompassBean">
        <property name="resourceDirectoryLocations">
            <list>
                <value>classpath:com/jdkcn/compass</value>
            </list>
        </property>
        <property name="connection">
            <value>/lucene/indexes</value>
        </property>
        <property name="compassSettings">
            <props>
                <prop key="compass.transaction.factory">
                    org.compass.spring.transaction.SpringSyncTransactionFactory
                </prop>
                <prop key="compass.engine.highlighter.default.formatter.simple.pre">
                    <![CDATA[<font color="red"><b>]]>
                </prop>
                <prop key="compass.engine.highlighter.default.formatter.simple.post">
                    <![CDATA[</b></font>]]>
                </prop>
            </props>
        </property>
        <property name="transactionManager">
            <ref bean="transactionManager" />
        </property>
    </bean>

ok了,页面上输出一下就能看到最终效果了
${hit.highlightedText['content']?if_exists}

最终效果展示请看
分享到:
评论

相关推荐

    compass搜索引擎技术

    Compass搜索引擎技术是一种基于Lucene的全文检索框架,它提供了更高级别的API和集成机制,使得在Java应用程序中实现搜索引擎功能变得更加便捷。Compass的主要目标是将全文索引能力无缝地融入到现有的业务应用程序中...

    compass对象搜索引擎

    Compass对象搜索引擎是一款基于Lucene的全文搜索引擎框架,它为Java开发者提供了高级的搜索功能,使得在应用程序中集成全文检索变得更加便捷。Compass的核心理念是将数据库中的对象与Lucene索引之间建立映射...

    基于Lucene的搜索引擎框架Compass教程

    Lucene提供了底层的搜索功能,而Compass是对Lucene的高级封装,它在Lucene的基础上添加了更多便利的功能,如ORM集成、事务支持等。对于开发者来说,使用Compass可以更快地上手,减少对Lucene底层细节的了解,提高...

    java搜索 compass资料

    ### Java搜索 Compass 资料知识点 #### 一、Compass 概述 Compass 是一个为 Java 应用程序提供全文检索功能的框架。它能够帮助开发者在 Java 应用程序中轻松实现复杂的搜索需求,并且具有较高的性能。Compass 基于...

    compass 全文搜索

    Compass全文搜索是一个基于Apache Lucene的高性能、易用的全文搜索引擎工具。Lucene是Java开发的开源库,它提供了文本分析、索引和搜索的基本功能。而Compass则在Lucene的基础上进行了封装,使得开发者可以更方便地...

    compass完整可用项目

    【compass完整可用项目】是一个基于特定技术栈的软件开发项目,该项目的核心是Compass库,一个与Lucene紧密集成的全文搜索引擎工具。Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者...

    Compass 的java代码

    6. **动态过滤器**:Compass允许你在运行时动态添加、修改和删除过滤器,以实现灵活的搜索条件控制。 7. **地理空间搜索**:Compass还支持地理空间搜索,可以对地理位置数据进行有效的检索。 **入门指南** 对于...

    compass annotation关联关系

    Compass 是一个全文搜索引擎库,它是对 Lucene 的封装,为 Java 应用提供了一种简单易用的接口。在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的...

    Spring ,JPA,Compass使用注解开发的博客站内搜索

    标题 "Spring ,JPA,Compass使用注解开发的博客站内搜索" 涉及的是在Java开发环境中,利用Spring框架、Java Persistence API (JPA) 和 Compass搜索引擎来实现一个博客系统的站内搜索功能。这是一项关键的技术,因为...

    Compass全文检索系列之一:Compass入门

    本文将介绍Compass,一个基于Lucene的全文搜索引擎库,为Java开发者提供了一种简单易用的方式来集成全文检索功能。Compass不仅提供了与ORM框架(如Hibernate、JPA等)的无缝集成,还支持动态索引更新,使得实时数据...

    Compass原理深入学习笔记

    Compass是一款基于Apache Lucene的全文搜索引擎框架,它为开发者提供了更高级别的抽象层,简化了搜索引擎的集成工作。在理解Compass之前,我们需要先了解全文检索的基本概念和原理。 全文检索是相对于传统的基于...

    ssh+compass实现站内搜索分页.rar

    5. **展示结果**:在Struts2的视图层(通常为JSP页面),将搜索结果传递给模板,渲染成用户友好的格式。同时,展示分页链接,用户可以通过点击这些链接切换不同的结果页。 6. **优化与性能**:根据需求,你可能需要...

    Compass全文检索完整实例,可运行

    Compass全文检索是一个强大的搜索引擎库,它为Java应用程序提供了便捷的全文索引和搜索功能。在本实例中,我们有一个可直接运行的Compass全文检索系统,已经集成了SSH(Struts、Spring、Hibernate)框架,这是一个...

    Compass技术文档

    Compass是一个高级开源的Java搜索引擎框架,旨在简化应用程序与搜索引擎之间的集成过程。它通过结合强大的Lucene搜索引擎以及流行的应用框架如Hibernate和Spring,使得开发者能够轻松地将搜索功能融入到Java应用程序...

    Lucene+compass学习资料

    例如,使用Compass将数据库中的数据同步到Lucene索引中,然后通过Ajax实现前端与后端的无刷新通信,当用户在搜索框中输入关键词时,立即向服务器发送请求,服务器利用Lucene进行查询,并用Ajax返回结果,这样就能在...

    基于Luncene的compass框架详解-java

    1. **Lucene**: Apache Lucene是一个基于Java的全文搜索引擎库,通过它可以轻松地为Java应用程序添加全文搜索功能。Lucene的主要工作是对文件中的每个词进行索引,这种索引机制极大地提高了搜索效率。它提供了一组...

    compass教程.pdf

    COMPASS 教程Pdf COMPASS 是一款专业的油气田设计和生产软件,主要用于油气田的规划、设计和生产过程。下面是 COMPASS 的一些重要知识点: 1. COMPASS WELLPLAN FOR WINDOWS 功能简介:COMPASS 的核心功能包括 ...

    compass_使用详解.pdf compass_教程 compass_试用案例

    ### Compass 使用详解 #### 一、Compass 概述 Compass 是一款开源的 Java 库,用于简化 Lucene 的使用。它通过提供类似于 Hibernate 的对象关系映射(ORM)功能,使得开发者能够更加轻松地将 Java 对象映射到 ...

Global site tag (gtag.js) - Google Analytics