- 浏览: 14314 次
- 性别:
- 来自: 合肥
文章分类
最新评论
昨天在学习compass,跑了下library的例子,将源码放入Eclipse的Java工程后,加入必要的jar包,发现一个错误
SimpleDateFormat sdf = new SimpleDateFormat(Library.MetaData.Birthdate.Format);提示找不到Library类,这
估计是作者将这个类打包漏了,不过没有什么影响,改成 new SimpleDateFormat("yyyy/MM/dd")就可以了,查看compass.cfg.xml文件,这是的索引是以文件形式存放的,运行LibraryTests, 顺利通过,看了参考文档,索引还可以存放在数据库中,看了下参考文档,都是基于
<compass name="default">
<connection>
<jdbc>
<dataSourceProvider>
<driverManager url="jdbc:hsqldb:mem:test"
username="sa" password=""
driverClass="org.hsqldb.jdbcDriver" />
</dataSourceProvider>
</jdbc>
</connection>
</compass>
这样的格式写的,可示例中是以<setting name="compass.engine.connection">target:/index</setting>去写的,当然你可以按照原来的方式去改下,这里就按照setting的方式去写,关键是找到属性名,找了参考文档在187页的A.19.Search Engine Jdbc一节中列出了相关的属性,于是想试下hsqldb,改写的compass.cfg.xml
<compass-core-configuration>
<compass>
<setting name="compass.engine.connection">jdbc://jdbc:hsqldb:mem:test</setting>
<setting name="compass.engine.store.jdbc.connection.provider.class">
org.compass.core.lucene.engine.store.jdbc.DriverManagerDataSourceProvider
</setting>
<setting name="compass.engine.store.jdbc.connection.driverClass">org.hsqldb.jdbcDriver</setting>
<setting name="compass.engine.store.jdbc.connection.username">sa</setting>
<setting name="compass.engine.store.jdbc.connection.password"></setting>
<meta-data resource="org/compass/sample/library/library.cmd.xml" />
</compass>
</compass-core-configuration>
测试同样顺利通过,毕竟hsqldb不是很方便,所以又想换别的数据库,当然MySQL是首选,修改compass.cfg.xml
<!DOCTYPE compass-core-configuration PUBLIC
"-//Compass/Compass Core Configuration DTD 2.0//EN"
"http://www.compass-project.org/dtd/compass-core-configuration-2.1.dtd">
<compass-core-configuration>
<compass>
<setting name="compass.engine.connection">jdbc://jdbc:mysql://localhost:3306/compass</setting>
<setting name="compass.engine.store.jdbc.connection.provider.class">
org.compass.core.lucene.engine.store.jdbc.DriverManagerDataSourceProvider
</setting>
<setting name="compass.engine.store.jdbc.connection.driverClass">com.mysql.jdbc.Driver</setting>
<setting name="compass.engine.store.jdbc.connection.username">Roger</setting>
<setting name="compass.engine.store.jdbc.connection.password">830708</setting>
<meta-data resource="org/compass/sample/library/library.cmd.xml" />
</compass>
</compass-core-configuration>,然后建立一个compass的数据库,当然Roger用户必须对数据库具有建表的权限,因为要建表来存放索引。可是运行测试的结果出乎意料,居然抛出异常:
org.compass.core.engine.SearchEngineException: Failed to create index for sub index [author]; nested exception is org.apache.lucene.store.jdbc.JdbcStoreException: Failed to execute sql [select name_, 'value_' as x, size_ from index_author where name_ = ?]; nested exception is java.lang.ArrayIndexOutOfBoundsException: null
org.apache.lucene.store.jdbc.JdbcStoreException: Failed to execute sql [select name_, 'value_' as x, size_ from index_author where name_ = ?]; nested exception is java.lang.ArrayIndexOutOfBoundsException: null
java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at com.mysql.jdbc.Blob.getBytes(Blob.java:123)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput.readInternal(FetchOnBufferReadJdbcIndexInput.java:132)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput.access$1400(FetchOnBufferReadJdbcIndexInput.java:35)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput$1.execute(FetchOnBufferReadJdbcIndexInput.java:91)
at org.apache.lucene.store.jdbc.support.JdbcTemplate.executeSelect(JdbcTemplate.java:112)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput.refill(FetchOnBufferReadJdbcIndexInput.java:58)
at org.apache.lucene.store.ConfigurableBufferedIndexInput.readByte(ConfigurableBufferedIndexInput.java:27)
at org.apache.lucene.store.ChecksumIndexInput.readByte(ChecksumIndexInput.java:36)
at org.apache.lucene.store.IndexInput.readInt(IndexInput.java:68)
at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:221)
at org.apache.lucene.index.IndexFileDeleter.<init>(IndexFileDeleter.java:175)
at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1093)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:698)
at org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore.createIndex(DefaultLuceneSearchEngineStore.java:493)
at org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore.createIndex(DefaultLuceneSearchEngineStore.java:487)
at org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore.createIndex(DefaultLuceneSearchEngineStore.java:482)
at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager$1.doInTransaction(DefaultLuceneSearchEngineIndexManager.java:103)
at org.compass.core.impl.DefaultCompass$CompassTransactionContext.execute(DefaultCompass.java:349)
at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager.createIndex(DefaultLuceneSearchEngineIndexManager.java:101)
at org.compass.sample.library.LibraryTests.setUp(LibraryTests.java:66)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
用hsqldb好好的,可是换成mysql就出问题,心想程序肯定不会有问题,唯一的问题就可能出现在mysql上,首先想的是驱动的问题,因为以前用SQL Server 2000也因为驱动出现了莫名其妙的问题,本来我用的是mysql-connector-java-3.12-bin.jar,一直也没出现问题,所以就没换,我找了5.0.0-beta-bin.jar换上,还是报同样的错误,难道还不够新,又下了个5.1.7换上,还是报错,不过这次不一样:
org.compass.core.engine.SearchEngineException: Failed to create index for sub index [author]; nested exception is org.apache.lucene.store.jdbc.JdbcStoreException: Failed to execute sql [select name_, 'value_' as x, size_ from index_author where name_ = ?]; nested exception is java.sql.SQLException: "pos" + "length" arguments can not be larger than the BLOB's length.
org.apache.lucene.store.jdbc.JdbcStoreException: Failed to execute sql [select name_, 'value_' as x, size_ from index_author where name_ = ?]; nested exception is java.sql.SQLException: "pos" + "length" arguments can not be larger than the BLOB's length.
java.sql.SQLException: "pos" + "length" arguments can not be larger than the BLOB's length.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.Blob.getBytes(Blob.java:142)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput.readInternal(FetchOnBufferReadJdbcIndexInput.java:132)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput.access$1400(FetchOnBufferReadJdbcIndexInput.java:35)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput$1.execute(FetchOnBufferReadJdbcIndexInput.java:91)
at org.apache.lucene.store.jdbc.support.JdbcTemplate.executeSelect(JdbcTemplate.java:112)
at org.apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput.refill(FetchOnBufferReadJdbcIndexInput.java:58)
at org.apache.lucene.store.ConfigurableBufferedIndexInput.readByte(ConfigurableBufferedIndexInput.java:27)
at org.apache.lucene.store.ChecksumIndexInput.readByte(ChecksumIndexInput.java:36)
at org.apache.lucene.store.IndexInput.readInt(IndexInput.java:68)
at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:221)
at org.apache.lucene.index.IndexFileDeleter.<init>(IndexFileDeleter.java:175)
at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1093)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:698)
at org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore.createIndex(DefaultLuceneSearchEngineStore.java:493)
at org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore.createIndex(DefaultLuceneSearchEngineStore.java:487)
at org.compass.core.lucene.engine.store.DefaultLuceneSearchEngineStore.createIndex(DefaultLuceneSearchEngineStore.java:482)
at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager$1.doInTransaction(DefaultLuceneSearchEngineIndexManager.java:103)
at org.compass.core.impl.DefaultCompass$CompassTransactionContext.execute(DefaultCompass.java:349)
at org.compass.core.lucene.engine.manager.DefaultLuceneSearchEngineIndexManager.createIndex(DefaultLuceneSearchEngineIndexManager.java:101)
at org.compass.sample.library.LibraryTests.setUp(LibraryTests.java:66)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
初步看出来是BLOB的字段大小的问题,看了下数据库,这是其实已经生成了index_author和index_book两个表,而且都有两行数据,可是为什么还报错呢,自己也百思不得其解,只好Google了一下,几经周折才找了解决方案http://forum.compass-project.org/thread.jspa?messageID=293782񇮖,照着做了下,果然测试成功,注意是"`"不是"'",可是为什么呢?查看了下源码,找到compass-2.1.0\src\main\src\org\apache\lucene\store\jdbc\dialect\MySQLDialect文件中的openBlobSelectQuote()和closeBlobSelectQuote()可以看到返回是"'",而像openQuote()和closeQuote()返回的而是"`",二者竟然不一样,难道是作者大意了?至此,问题全部解决。
相关推荐
这个压缩包中的"简单的compass示例源码"是为了帮助开发者理解如何在实际项目中使用Compass进行全文检索。 首先,`.classpath`和`.project`是Eclipse项目配置文件,它们定义了项目的类路径和构建设置。这表明这个...
总结来说,这个示例项目是一个完整的Java应用框架,展示了如何优雅地集成Compass 2.0、Spring和Hibernate,实现一个功能强大的、支持全文搜索的持久层解决方案。它不仅有助于理解这三个框架的基本用法,还提供了实践...
Compass是一款基于Lucene的全文搜索引擎库,它简化了在Java应用中添加全文搜索功能的过程。Struts2、Spring和Hibernate则是Java开发中常见的三大框架,分别用于MVC(Model-View-Controller)架构、依赖注入和持久层...
Compass提供了监控工具和日志记录功能,帮助开发者了解索引和查询的性能,及时发现并解决问题。 通过以上步骤,你可以在Eclipse环境下,结合MySQL数据库,利用Compass搜索引擎技术实现类似Google的搜索功能。这...
网上有很多compass示例没法运行,或者运行报错,给初学者带来了很大的不便,因此我修改了一些实例,读者只需要configuration build path即可,环境是eclipse,里面有该工程所需的jar包。希望对大家有帮助。
### Compass 使用详解 #### 一、Compass 概述 Compass 是一款开源的 Java 库,用于简化 Lucene 的使用。它通过提供类似于 Hibernate 的对象关系映射(ORM)功能,使得开发者能够更加轻松地将 Java 对象映射到 ...
#### 三、Compass 使用示例 在题目中提供的部分Java代码中,展示了一个名为`ProductInfo`的实体类,该类通过使用Compass注解实现了全文检索功能。 1. **实体类定义** ```java @Entity @Searchable public ...
此外,提供的源码文件可能包含了每个章节的示例代码,读者可以通过实际运行和修改这些代码来加深对Sass和Compass的理解。这是一份宝贵的实践资料,能够帮助你将理论知识转化为实际技能。 总之,《Sass和Compass设计...
【compass完整可用项目】是一个基于特定技术栈的软件开发项目,该项目的核心是Compass库,一个与Lucene紧密集成的全文搜索引擎工具。Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者...
下面是一个简单的示例,展示如何使用Compass进行搜索: ```java // 初始化Compass Compass compass = new CompassBuilder().configure("/path/to/compass.conf").build(); // 开启Gps,开始索引 compass.getGps()....
Compass 是一个搜索引擎框架,旨在提供高效、可扩展的搜索解决方案。以下是 Compass 入门指南,涵盖了 Compass 的核心概念、配置文件、注解方式、核心 API、与 Spring 集成等方面。 Compass 的配置文件 Compass 的...
Compass是MongoDB的官方图形界面工具,它提供了一个用户友好的界面,用于可视化数据库和集合,帮助开发者和管理员进行数据探索、查询构建、性能分析以及基本的数据库管理。通过Compass,用户可以轻松地浏览和操作...
`compass学习笔记.doc`是一份关于Compass的学习文档,可能包含了使用Compass的基本步骤,常见问题解答,以及一些最佳实践。这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`...
Compass是一个开源项目,它为Sass提供了一套预先定义的CSS3 Mixins(混合)和模块,使得开发者可以方便地利用这些功能,而无需关心底层的浏览器兼容性问题。Compass通过引入一种更高级的CSS语法——Sass,使CSS编写...
### Sass与Compass实战知识点详解 #### 一、Sass简介 Sass(Syntactically Awesome Style Sheets)是一种预处理器脚本语言,用于扩展CSS的功能。它为CSS增加了诸如变量、嵌套规则、混合器(mixins)、继承、函数等...
标题 "compass+ssh2集成 hibernategps问题" 暗示了这是一个关于Java开发中的技术集成问题,其中涉及到三个主要组件:Compass...阅读相关文档、查看示例代码和在线社区的帖子(比如提供的博客链接)通常能帮助解决问题。
下面是一个基于SSH(Struts2+Spring+Hibernate)架构的Compass使用示例: 1. **添加依赖库**:在SSH项目基础上添加Compass及相关依赖库,具体包括: - `compass-2.1.2.jar` - `compass-index-patch.jar` - `...
《Sass和Compass设计师指南源代码》是一个深入解析Sass和Compass技术的资源集合,包含多个章节的源码示例,旨在帮助设计师更好地理解和应用这两种强大的CSS预处理器。Sass(Syntactically Awesome Style Sheets)是...
在本项目中,"compass(指南针示例).zip" 是一个包含 C++ 编写的指南针程序的压缩文件。这个程序可能旨在演示如何利用编程技术实现一个基本的计算机图形学应用,显示一个虚拟的指南针指示方向。让我们深入探讨一下...