`
mao_lu
  • 浏览: 8560 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于Compass+Spring 全文搜索的问题 我的个人站点:http://mao52.com

阅读更多

    最近想使用Compass+Spring +Lucene做全文搜索,在网上找了些代码,但是没有完整的。发现网上的东西都是一枝半解,在自己的机器上调试了一下,但没有成功,希望有识之士帮看一下。

错误如下:

java.lang.NullPointerException
	sc.compass.CompassSearchService.search(CompassSearchService.java:48)
	sc.util.action.SearchAction.s(SearchAction.java:115)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
由于本人对这几个类的代码很陌生,不知道问题出在哪里,原代码如下:

package sc.compass;

import org.compass.core.Compass;
import org.compass.core.CompassCallback;
import org.compass.core.CompassDetachedHits;
import org.compass.core.CompassException;
import org.compass.core.Compass;
import org.compass.core.CompassQuery;
import org.compass.core.CompassSession;
import org.compass.core.CompassTemplate;
import org.compass.core.CompassTransaction;
import org.compass.spring.web.mvc.CompassSearchCommand;
import org.compass.spring.web.mvc.CompassSearchResults;
import org.springframework.beans.factory.InitializingBean;

import sc.compass.AdvancedSearchCommand.CompassSort;

/**
 * 仿照 {@link org.compass.spring.web.mvc.CompassSearchController}
 * 中的代码,构建了一个Service,方便不使用Spring MVC
 *
 * @see org.compass.spring.web.mvc.CompassSearchController
 * @see org.compass.spring.web.mvc.AbstractCompassCommandController
 */
public class CompassSearchService implements InitializingBean {
    /**
     * 每页显示的条目数量
     */
    private Integer pageSize;

    private Compass compass;

    private CompassTemplate compassTemplate;

    /**
     * 公开的搜索接口,返回匹配的搜索结果,与
     * {@link org.compass.spring.web.mvc.CompassSearchController#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, Object, org.springframework.validation.BindException)
     * 处理相似
     *
     * @param command
     * @return
     * @see org.compass.spring.web.mvc.CompassSearchController#handle(javax.servlet.http.HttpServletRequest,
     *      javax.servlet.http.HttpServletResponse, java.lang.Object,
     *      org.springframework.validation.BindException)
     */
    public CompassSearchResults search(final CompassSearchCommand command) {
        CompassSearchResults searchResults = (CompassSearchResults) getCompassTemplate()
                .execute(
                        CompassTransaction.TransactionIsolation.READ_ONLY_READ_COMMITTED,
                        new CompassCallback() {
                            public Object doInCompass(CompassSession session)
                                    throws CompassException {
                                return performSearch(command, session);
                            }
                        });

        return searchResults;
    }

    /**
     * 通过此方法调用搜索引擎,进行结果匹配搜索
     *
     * @param searchCommand
     * @param session
     * @return
     * @see org.compass.spring.web.mvc.CompassSearchController#performSearch(org.compass.spring.web.mvc.CompassSearchCommand,
     *      org.compass.core.CompassSession)
     */
    protected CompassSearchResults performSearch(
            CompassSearchCommand searchCommand, CompassSession session) {
        if (AdvancedSearchCommand.class.isAssignableFrom(searchCommand
                .getClass())) {
            AdvancedSearchCommand advancedCommand = (AdvancedSearchCommand) searchCommand;
            advancedCommand.setupQuery();
        }
        long time = System.currentTimeMillis();
        CompassQuery query = buildQuery(searchCommand, session);
        Compass hits = query.hits();
        CompassDetachedHits detachedHits;
        CompassSearchResults.Page[] pages = null;
        if (pageSize == null) {
            doProcessBeforeDetach(searchCommand, session, hits, -1, -1);
            detachedHits = hits.detach();
        } else {
            int iPageSize = pageSize.intValue();
            int page = 0;
            int hitsLength = hits.getLength();
            if (searchCommand.getPage() != null) {
                page = searchCommand.getPage().intValue();
            }
            int from = page * iPageSize;

            if (from > hits.getLength()) {

                // 如果起始的条目大于搜索到的条目
                from = hits.getLength() - iPageSize;
                doProcessBeforeDetach(searchCommand, session, hits, from,
                        hitsLength);
                detachedHits = hits.detach(from, hitsLength);
            } else if ((from + iPageSize) > hitsLength) {

                // 结束的条目大于搜索到的结果
                doProcessBeforeDetach(searchCommand, session, hits, from,
                        hitsLength);
                detachedHits = hits.detach(from, hitsLength);
            } else {

                // 中间的页码,直接取出相应的条目
                doProcessBeforeDetach(searchCommand, session, hits, from,
                        iPageSize);
                detachedHits = hits.detach(from, iPageSize);
            }
            doProcessAfterDetach(searchCommand, session, detachedHits);
            int numberOfPages = (int) Math.ceil((float) hitsLength / iPageSize);
            pages = new CompassSearchResults.Page[numberOfPages];
            for (int i = 0; i < pages.length; i++) {
                pages[i] = new CompassSearchResults.Page();
                pages[i].setFrom(i * iPageSize + 1);
                pages[i].setSize(iPageSize);
                pages[i].setTo((i + 1) * iPageSize);
                if (from >= (pages[i].getFrom() - 1) && from < pages[i].getTo()) {
                    pages[i].setSelected(true);
                } else {
                    pages[i].setSelected(false);
                }
            }
            if (numberOfPages > 0) {
                CompassSearchResults.Page lastPage = pages[numberOfPages - 1];
                if (lastPage.getTo() > hitsLength) {
                    lastPage.setSize(hitsLength - lastPage.getFrom());
                    lastPage.setTo(hitsLength);
                }
            }
        }
        time = System.currentTimeMillis() - time;
        CompassSearchResults searchResults = new CompassSearchResults(
                detachedHits.getHits(), time);
        searchResults.setPages(pages);
        return searchResults;
    }

    /**
     * 构建Lucene 搜索器
     *
     * @param searchCommand
     * @param session
     * @return
     */
    protected CompassQuery buildQuery(CompassSearchCommand searchCommand,
                                      CompassSession session) {
        CompassQuery query = session.queryBuilder().queryString(
                searchCommand.getQuery().trim()).toQuery();

        if (AdvancedSearchCommand.class.isAssignableFrom(searchCommand
                .getClass())) {
            AdvancedSearchCommand advancedSearchCommand = (AdvancedSearchCommand) searchCommand;

            for (CompassSort sort : advancedSearchCommand.getSortMap()) {
                query.addSort(sort.name, sort.type, sort.direction);
            }
        }
        return query;
    }

    /**
     * 在detach 之前,可以做一些操作。比如highlighting...
     *
     * @param searchCommand
     * @param session
     * @param hits
     * @param from          需要注意的是,如果pageSize 没有指定,那么这里传入的参数为-1
     * @param size
     */
    protected void doProcessBeforeDetach(CompassSearchCommand searchCommand,
                                         CompassSession session, Compass hits, int from, int size) {
    }

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

    }

    public void afterPropertiesSet() throws Exception {
        if (compass == null) {
            throw new IllegalArgumentException("Must set compass proerty");
        }
        this.compassTemplate = new CompassTemplate(compass);
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public void setCompass(Compass compass) {
        this.compass = compass;
    }

    protected CompassTemplate getCompassTemplate() {
        return this.compassTemplate;
    }

}

Action如下:

 public ActionForward s(ActionMapping mapping, ActionForm form, HttpServletRequest request,
              HttpServletResponse response) throws Exception {
    CompassSearchService aa = new CompassSearchService();
    AdvancedSearchCommand ac = new AdvancedSearchCommand();
   
    //String sm = request.getParameter("query");
    ac.addSort("临床医学科研程序与方法", "String", true);
    CompassSearchResults  result = aa.search(ac);
    for(int i=0;i       Compas hits=result.getHits()[i];
       Book book=(Book)hits.getData();
       System.out.println(book.getSm());
      
       System.out.println(book.getId());

      }
    //request.setAttribute("result", result);
    return mapping.findForward("test");
   
   }

分享到:
评论
2 楼 shaucle 2006-12-22  
或手工注入compassTemplate
1 楼 shaucle 2006-12-22  
CompassSearchService要从spring中取得!

晕死,这是很低级的问题啊!

相关推荐

    指南针Compass

    《指南针Compass详解》 在信息技术领域,指南针(Compass)可能并不是我们传统意义上的地理定位工具,而是一款在软件开发中广泛使用的工具,尤其是针对Web开发中的样式表(CSS)管理。 Compass 是一个基于 Sass 的 ...

    互联网程序

    电子科技大学 互联网程序设计,课件 内容丰富,深入浅出,很适合初学者

    compass+ibatis+spring+struts2整合开发

    compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发

    Lucene+compass+spring+jdbc+庖丁的一个例子

    标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...

    COMPASS+spring构建自己的搜索引擎.pdf

    标题提及的"COMPASS+spring构建自己的搜索引擎"是关于如何使用Compass搜索引擎框架与Spring框架集成,构建一个自定义的全文搜索引擎。Compass是一个开源的搜索引擎库,它提供了与ORM框架(如Hibernate)的集成,使得...

    Compass+ lucene 通用代码(脱离数据库)

    《Compass+Lucene:构建高效全文搜索引擎》 在信息技术高速发展的今天,数据量的爆炸式增长使得传统的数据库查询方式面临着挑战。此时,全文搜索引擎以其快速、高效的特性,成为了处理大量非结构化文本数据的首选...

    compass-2.2.0+hibernate-3.2+struts-2.1.8.1+spring-framework-2.5.4

    标题 "compass-2.2.0+hibernate-3.2+struts-2.1.8.1+spring-framework-2.5.4" 指的是一个集成开发环境,它结合了四个关键的技术组件:Compass、Hibernate、Struts 2 和 Spring Framework,这些都是Java Web开发中的...

    compass_hibernate_spring.zip

    &lt;prop key="compass.engine.connection"&gt;file:./compass_data&lt;/prop&gt; &lt;prop key="compass.gps.device"&gt;hibernate&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;property name="sessionFactory" ref="sessionFactory"/&gt; &lt;/bean...

    maptalks.control.compass:Maptalks指南针控件

    maptalks.control.compass maptalks罗盘控件。 例子 安装 使用npm npm install maptalks.control.compass : npm install maptalks.control.compass 。 用纱安装: yarn add maptalks.control.compass 。 从下载...

    基于Compass2.2与Spring 结合建立索引的实例

    ### 基于Compass2.2与Spring结合建立索引的实例 #### 一、Compass简介 Compass是一个开源的.NET和Java框架,它为应用程序提供了完整的文本搜索功能。该框架支持多种搜索引擎(如Elasticsearch, Solr等),使得开发...

    JAVA 全文搜索 struts2+spring+hibernte+compass整合记录

    在本项目中,"JAVA 全文搜索 struts2+spring+hibernate+compass整合记录" 是一个关于如何在Java环境下集成四个关键组件来实现全文搜索引擎的实践教程。Struts2是一个流行的MVC框架,Spring是核心的依赖注入框架,...

    struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现(无jar包)

    Compass是一款基于Lucene的全文搜索引擎,它使得Java应用能够方便地集成全文搜索功能。Compass提供了对JDBC、Hibernate等数据源的直接支持,可以自动索引数据库中的数据,实现快速检索。 在"struts2+spring2.5+...

    compass包及相关学习资料

    Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.内容包括compass的jar包及从网上搜集的相关学习资料. 附两个不错的资料地址: ...

    windows版本 mongodb可视化管理mongodb-compass-1.43.0-win32-x64.exe

    mongodb可视化管理mongodb-compass-1.43.0-win32-x64.exe mongodb compass官网下载地址:https://www.mongodb.com/try/download/compass mongodb相关下载地址: mongodb社区版:...

    mongodb+spring+maven环境搭建

    Spring框架是Java开发中的一个核心库,提供了一整套企业级应用开发的解决方案,包括依赖注入、数据访问、Web开发等。Maven则是一个项目管理工具,帮助开发者管理和构建Java项目,通过其依赖管理系统简化了库的引用和...

    Struts+Hibernate+spring+jpa+lucene+jbpm+compass配置文件

    Struts、Hibernate、Spring、JPA、Lucene、JBPM和Compass是Java开发中常用的一系列技术,它们各自在不同的领域发挥着重要作用。这里我们将深入探讨这些技术以及如何将它们整合在一起进行配置。 1. **Struts**:...

    compass+ssh2集成 hibernategps问题

    标题中的“compass+ssh2集成 hibernategps问题”指的是在Java开发中,开发者尝试将Compass搜索引擎库与SSH2(Spring、Struts和Hibernate)框架整合时遇到的问题,特别是与Hibernate的GPS(Global Persistent ...

    struts2+hibernate3+spring3+compass

    struts2+spring3+hibernate3+compass实现全文检索功能,希望对初学者有所帮助!

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0产品搜索

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................

Global site tag (gtag.js) - Google Analytics