h2全文检索


 

使用自身提供的全文检索

 

初始化需要用:

 

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,并使用Lucene3.x版本默认情况下,H2版本1.3.x之下。如何做到这一点取决于应用程序,如果您使用的H2控制台,你可以添加了Lucene jar文件的环境变量H2DRIVERSCLASSPATH。要初始化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的全文检索实现内部不同步。如果您在更新数据库的全文检索和查询,同时(直接使用H2Lucene本身的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将有助于防止热重新部署或重新启动服务器时的异常。

 

 

 

错误代码不兼容

 

有一个不符合SpringJdbcTemplateH2版本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>

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值