2011-07-10 35 views
7

考慮下面的例子如何在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本地全文搜索

回答

8
  1. 是,在使用FT_SEARCH查詢每一行代表一個模式錶行,其中的關鍵詞之一被發現%埃爾%。搜索是不區分大小寫的,並且參數FT_SEARCHtext可能包含多個單詞。例如,

    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)往往是昂貴的。

+0

這正是我想要的。謝謝。 – Vivek

+0

再次有什麼辦法來索引h2數據庫與lucene如果有任何告訴我。 – Vivek

+0

[使用Lucene全文搜索](http://www.h2database.com/html/tutorial.html#fulltext)非常相似,只需要在類路徑中使用Lucene庫。 – trashgod

3

我是不是要再次執行該 「公」。 「TEST」 WHERE 「ID」= 1獲取包含 '你好' 字的記錄?

是的,除非您使用trashgod描述的連接。原因是:通常行比兩個單詞大得多。例如,一行包含一個帶文檔的CLOB。如果全文搜索的結果將包含數據,那麼全文搜索會慢得多。

什麼是查詢從FT_Search中搜索'ell'字的所有記錄。如H2中的%ell%原生全文搜索

原生全文搜索無法直接進行。原因是:全文搜索僅索引整個單詞。 (順便說一下,如果你只知道一個詞的一部分,谷歌支持搜索嗎?Apache Lucene確實支持它)實際上,對於H2來說,有一種方法:首先搜索詞表(FT.WORDS)進行匹配,然後使用常規搜索。

+0

是的,Lucene支持[wildcard](http://wiki.apache.org/lucene-java/LuceneFAQ#What_wildcard_search_support_is_available_from_Lucene.3F);我在我的答案中解決了(以前)斷開的鏈接。搜索「FT.WORDS」進行部分匹配的好主意。 – trashgod

+0

實際上,由於常規全文搜索使用AND連接搜索詞,因此只需在單個查詢中查找FT.WORDS的結果可能無效。假設你想搜索'AB%',一個FT.WORDS查詢可能返回ABCDE和ABXYZ作爲候選詞。現在,對「ABCDE ABXYZ」的常規全文搜索將返回交點,最有可能是空集。 要使用FT.WORDS方法,您需要首先展開您的'AB%'字詞,然後爲每個擴展調用全文搜索。如果你有多個搜索條件,你將不得不搜索*所有組合*。 – hendrik

相關問題