使用自身提供的全文检索
初始化需要用:
CREATE ALIAS IF NOT EXISTS FT_INIT FOR "org.h2.fulltext.FullText.init";
CALL FT_INIT();
你需要你想用它来初始化它在每个数据库中。之后,您可以创建全文索引的表使用:
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);
INSERT INTO TEST VALUES(1, 'Hello World');
CALL FT_CREATE_INDEX('PUBLIC', 'TEST', NULL);
Schema名称,Table的名称, Column的列名(以逗号分隔)是可选的,在这种情况下,所有的列上都会有索引。该索引是实时更新的, 搜索索引,使用下面的查询:
SELECT * FROM FT_SEARCH('Hello', 0, 0);
这将产生一个结果集,其中包含的查询需要检索的数据:
QUERY: "PUBLIC"."TEST" WHERE "ID"=1
要获得原始数据,使用
SELECT * FROM FT_SEARCH_DATA('Hello', 0, 0);
结果包含的列
SCHEMA(架构),TABLE(表名),COLUMNS(列名的数组),KEYS(列值的数组)。
要加入一个表,使用中:
SELECT T.* FROM FT_SEARCH_DATA('Hello', 0, 0) FT, TEST T WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0];
您也可以在Java应用程序中调用索引:
org.h2.fulltext.FullText.search(conn, text, limit, offset);
org.h2.fulltext.FullText.searchData(conn, text, limit, offset);
使用Lucene的全文检索
要使用Lucene全文搜索,你需要的Lucene的库中的类路径。目前2.x版本的Apache Lucene默认情况下,H2版本1.2.x,并使用Lucene的3.x版本默认情况下,H2版本1.3.x之下。如何做到这一点取决于应用程序,如果您使用的H2控制台,你可以添加了Lucene jar文件的环境变量H2DRIVERS或CLASSPATH。要初始化Lucene的全文搜索的数据库,请致电:
CREATE ALIAS IF NOT EXISTS FTL_INIT FOR "org.h2.fulltext.FullTextLucene.init";
CALL FTL_INIT();
你需要你想用它来初始化它在每个数据库中。之后,您可以创建全文索引的表使用:
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);
INSERT INTO TEST VALUES(1, 'Hello World');
CALL FTL_CREATE_INDEX('PUBLIC', 'TEST', NULL);
公众的架构的名称,测试表的名称。列名的列表(以逗号分隔)是可选的,在这种情况下,所有的列上都有索引。该指数是实时更新的。搜索索引,使用下面的查询:
SELECT * FROM FTL_SEARCH('Hello', 0, 0);
这将产生一个结果集,其中包含的查询需要检索的数据:
QUERY: "PUBLIC"."TEST" WHERE "ID"=1
要获得原始数据,使用FTL_SEARCH_DATA('Hello', 0, 0);。结果包含的列SCHEMA(架构),TABLE(表名),COLUMNS(数组的列名),KEYS(对象数组)。要加入一个表,使用中:SELECT T.* FROM FTL_SEARCH_DATA('Hello', 0, 0) FT, TEST T WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0];
您也可以在Java应用程序中调用索引:
org.h2.fulltext.FullTextLucene.search(conn, text, limit, offset);
org.h2.fulltext.FullTextLucene.searchData(conn, text, limit, offset);
Lucene的全文搜索支持搜索仅在特定的列。列名必须是大写字母(但如果原来的列双引号)。对于列名用下划线(_)开始,另一个需要添加下划线。示例:
CREATE ALIAS IF NOT EXISTS FTL_INIT FOR "org.h2.fulltext.FullTextLucene.init";
CALL FTL_INIT();
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST(ID INT PRIMARY KEY, FIRST_NAME VARCHAR, LAST_NAME VARCHAR);
CALL FTL_CREATE_INDEX('PUBLIC', 'TEST', NULL);
INSERT INTO TEST VALUES(1, 'John', 'Wayne');
INSERT INTO TEST VALUES(2, 'Elton', 'John');
SELECT * FROM FTL_SEARCH_DATA('John', 0, 0);
SELECT * FROM FTL_SEARCH_DATA('LAST_NAME:John', 0, 0);
CALL FTL_DROP_ALL();
Lucene的全文检索实现内部不同步。如果您在更新数据库的全文检索和查询,同时(直接使用H2或Lucene本身的Java API),您需要确保操作正确同步。如果是这样的情况下,您可能会收到例外,如org.apache.lucene.store.AlreadyClosedException: this IndexReader is closed。
使用Spring
使用TCP服务器
使用下面的配置来启动和停止使用Spring框架的H2 TCP服务器:
<bean id = "org.h2.tools.Server"
class="org.h2.tools.Server"
factory-method="createTcpServer"
init-method="start"
destroy-method="stop">
<constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,8043" />
</bean>
destroy-method将有助于防止热重新部署或重新启动服务器时的异常。
错误代码不兼容
有一个不符合Spring的JdbcTemplate和H2版本1.3.154,更新的,因为一个变化中的错误代码。这将导致JdbcTemplate中未检测到重复的关键条件,所以DataIntegrityViolationException而不是被抛出DuplicateKeyException。的问题SPR-8235。解决方法是添加下面的XML文件的根目录开始:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
>
<import resource="classpath:org/springframework/jdbc/support/sql-error-codes.xml"/>
<bean id = "H2" class="org.springframework.jdbc.support.SQLErrorCodes">
<property name="badSqlGrammarCodes">
<value>
42000,42001,42101,42102,42111,42112,42121,42122,42132
</value>
</property>
<property name="duplicateKeyCodes">
<value>23001,23505</value>
</property>
<property name="dataIntegrityViolationCodes">
<value>22003,22012,22025,23000</value>
</property>
<property name="dataAccessResourceFailureCodes">
<value>90046,90100,90117,90121,90126</value>
</property>
<property name="cannotAcquireLockCodes">
<value>50200</value>
</property>
</bean>
</beans>