2011-07-10 13 views
7

H2データベースでのFULL-TEXT SEARCHの使用方法

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" "ID" = 1を返しています。

  1. 「こんにちは」単語を含むレコードを取得するには、この"PUBLIC"."TEST" WHERE "ID"=1を再度実行する必要がありますか?
  2. FT_Searchから「ell」という単語を含むすべてのレコードを検索するクエリとは何ですか?そのような%エル%H2ネイティブ全文検索

答えて

8
  1. における等はい、FT_SEARCHを使用して、クエリ内の各行は、キーワードのいずれかが検出されたスキーマ・テーブルの行を表します。検索では大文字と小文字は区別されず、FT_SEARCHへのtextのパラメータには複数の単語が含まれる場合があります。例えば、

    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); 
    

    戻り、わずか3行:

    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検索をサポートする(例えば、*エル)高価になる傾向があります。

+0

これはまさに私が欲しいものです。ありがとうございました。 – Vivek

+0

もう一度luceneを使ってh2データベースのインデックスを作成する方法はありますか? – Vivek

+0

[Lucene Fulltext Searchの使用](http://www.h2database.com/html/tutorial.html#fulltext)は非常に似ていますが、クラスパスにLuceneライブラリが必要です。 – trashgod

3

私は再び "ID" = 1 'こんにちはという言葉を含むレコードを取得するには、この "PUBLIC"。 "TEST" を実行する必要がありますか?

はい、trashgodの説明に従って結合を使用する場合を除きます。理由は:通常、行はちょうど2つの単語よりはるかに大きくなります。たとえば、行にはドキュメントを含むCLOBが含まれています。フルテキスト検索の結果にデータが含まれていると、フルテキスト検索ははるかに遅くなります。

FT_Searchから「ell」という単語を含むすべてのレコードを検索するクエリとは何ですか? H2のような%ell%のようなものネイティブの全文検索

ネイティブのフルテキスト検索では、それを直接行うことはできません。その理由は、全文検索は単語全体を索引付けするだけです。 (ちなみ:Googleの検索では、単語の一部しか知りませんでしたか?Apache Luceneはそれをサポートしています)実際には、H2の場合、まず単語表(FT.WORDS)通常の検索を使用します。

+0

はい、Luceneは[ワイルドカード]をサポートしています(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

関連する問題