最近想使用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");
}
分享到:
- 2006-12-22 08:56
- 浏览 3547
- 评论(2)
- 论坛回复 / 浏览 (2 / 6331)
- 查看更多
相关推荐
《指南针Compass详解》 在信息技术领域,指南针(Compass)可能并不是我们传统意义上的地理定位工具,而是一款在软件开发中广泛使用的工具,尤其是针对Web开发中的样式表(CSS)管理。 Compass 是一个基于 Sass 的 ...
电子科技大学 互联网程序设计,课件 内容丰富,深入浅出,很适合初学者
compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发
标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...
标题提及的"COMPASS+spring构建自己的搜索引擎"是关于如何使用Compass搜索引擎框架与Spring框架集成,构建一个自定义的全文搜索引擎。Compass是一个开源的搜索引擎库,它提供了与ORM框架(如Hibernate)的集成,使得...
《Compass+Lucene:构建高效全文搜索引擎》 在信息技术高速发展的今天,数据量的爆炸式增长使得传统的数据库查询方式面临着挑战。此时,全文搜索引擎以其快速、高效的特性,成为了处理大量非结构化文本数据的首选...
标题 "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开发中的...
<prop key="compass.engine.connection">file:./compass_data</prop> <prop key="compass.gps.device">hibernate</prop> </props> </property> <property name="sessionFactory" ref="sessionFactory"/> </bean...
maptalks.control.compass maptalks罗盘控件。 例子 安装 使用npm npm install maptalks.control.compass : npm install maptalks.control.compass 。 用纱安装: yarn add maptalks.control.compass 。 从下载...
### 基于Compass2.2与Spring结合建立索引的实例 #### 一、Compass简介 Compass是一个开源的.NET和Java框架,它为应用程序提供了完整的文本搜索功能。该框架支持多种搜索引擎(如Elasticsearch, Solr等),使得开发...
在本项目中,"JAVA 全文搜索 struts2+spring+hibernate+compass整合记录" 是一个关于如何在Java环境下集成四个关键组件来实现全文搜索引擎的实践教程。Struts2是一个流行的MVC框架,Spring是核心的依赖注入框架,...
Compass是一款基于Lucene的全文搜索引擎,它使得Java应用能够方便地集成全文搜索功能。Compass提供了对JDBC、Hibernate等数据源的直接支持,可以自动索引数据库中的数据,实现快速检索。 在"struts2+spring2.5+...
Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.内容包括compass的jar包及从网上搜集的相关学习资料. 附两个不错的资料地址: ...
mongodb可视化管理mongodb-compass-1.43.0-win32-x64.exe mongodb compass官网下载地址:https://www.mongodb.com/try/download/compass mongodb相关下载地址: mongodb社区版:...
Spring框架是Java开发中的一个核心库,提供了一整套企业级应用开发的解决方案,包括依赖注入、数据访问、Web开发等。Maven则是一个项目管理工具,帮助开发者管理和构建Java项目,通过其依赖管理系统简化了库的引用和...
Struts、Hibernate、Spring、JPA、Lucene、JBPM和Compass是Java开发中常用的一系列技术,它们各自在不同的领域发挥着重要作用。这里我们将深入探讨这些技术以及如何将它们整合在一起进行配置。 1. **Struts**:...
标题中的“compass+ssh2集成 hibernategps问题”指的是在Java开发中,开发者尝试将Compass搜索引擎库与SSH2(Spring、Struts和Hibernate)框架整合时遇到的问题,特别是与Hibernate的GPS(Global Persistent ...
struts2+spring3+hibernate3+compass实现全文检索功能,希望对初学者有所帮助!
struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................