考虑以下示例
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 。
"PUBLIC"."TEST" WHERE "ID"=1
以获取包含“Hello”字样的记录?答案 0 :(得分:9)
是的,使用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
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)进行匹配,然后使用常规搜索。