如何在H2数据库中使用FULL-TEXT SEARCH?

时间:2011-07-10 14:45:37

标签: database full-text-search h2

考虑以下示例

CREATE ALIAS IF NOT EXISTS FT_INIT FOR "org.h2.fulltext.FullText.init";
CALL FT_INIT();
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);
INSERT INTO TEST VALUES(1, 'Hello World');
CALL FT_CREATE_INDEX('PUBLIC', 'TEST', NULL);

我执行了以下查询

SELECT * FROM FT_SEARCH('Hello', 0, 0);

但是此查询返回“PUBLIC”。“TEST”WHERE“ID”= 1

  1. 我是否必须再次执行此"PUBLIC"."TEST" WHERE "ID"=1以获取包含“Hello”字样的记录?
  2. 查询FT_Search中包含'ell'字样的所有记录的查询是什么。例如像H2原生全文搜索中的%ell%

2 个答案:

答案 0 :(得分:9)

  1. 是的,使用FT_SEARCH的查询中的每一行代表一个架构表行,其中找到了一个关键字。搜索不区分大小写,text FT_SEARCH参数可能包含多个单词。例如,

    DELETE FROM TEST;
    INSERT INTO TEST VALUES(1, 'Hello World');
    INSERT INTO TEST VALUES(2, 'Goodbye World');
    INSERT INTO TEST VALUES(3, 'Hello Goodbye');
    CALL FT_REINDEX();
    SELECT * FROM FT_SEARCH('hello goodbye', 0, 0);
    

    仅返回第三行:

    QUERY                           SCORE  
    "PUBLIC"."TEST" WHERE "ID"=3    1.0
    

    另请注意,FT_SEARCH_DATA可用于检索数据本身。例如,

    SELECT T.* FROM FT_SEARCH_DATA('hello', 0, 0) FT, TEST T
    WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0];
    

    返回包含关键字的行:

    ID   NAME  
    1    Hello World
    3    Hello Goodbye
    
  2. Apache Lucene支持wildcard次搜索,但前导通配符(例如* ell)往往价格昂贵。

答案 1 :(得分:4)

  

我是否必须再次执行此“PUBLIC”。“TEST”WHERE“ID”= 1以获取包含“Hello”字样的记录?

是的,除非您使用trashgod所描述的联接。原因是:通常行比两个单词大得多。例如,一行包含带有文档的CLOB。如果全文搜索的结果将包含数据,则全文搜索会慢得多。

  

从FT_Search中搜索包含'ell'字样的所有记录的查询是什么。例如在H2 Native全文搜索中的%ell%

本机全文搜索无法直接执行此操作。原因是:全文搜索仅索引整个单词。 (顺便说一下:如果你只知道一个单词的一部分,谷歌是否支持搜索?Apache Lucene确实支持它)实际上,对于H2,有一种方法:首先,搜索单词表(FT.WORDS)进行匹配,然后使用常规搜索。