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

Viv*_*vek 8 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);
Run Code Online (Sandbox Code Playgroud)

我已经执行了以下查询

SELECT * FROM FT_SEARCH('Hello', 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是这个查询返回"PUBLIC"."TEST"WHERE"ID"= 1.

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

tra*_*god 9

  1. 是的,查询中的每一行FT_SEARCH代表一个schema-table-row,其中找到了一个关键字.搜索不区分大小写,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);
    
    Run Code Online (Sandbox Code Playgroud)

    仅返回第三行:

    QUERY                           SCORE  
    "PUBLIC"."TEST" WHERE "ID"=3    1.0
    
    Run Code Online (Sandbox Code Playgroud)

    另请注意,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];
    
    Run Code Online (Sandbox Code Playgroud)

    返回包含关键字的两行:

    ID   NAME  
    1    Hello World
    3    Hello Goodbye
    
    Run Code Online (Sandbox Code Playgroud)
  2. Apache Lucene支持通配符搜索,虽然领先的通配符(例如*ell)往往很昂贵.