Как использовать ПОЛНЫЙ ТЕКСТОВЫЙ ПОИСК в базе данных H2? - PullRequest
8 голосов
/ 10 июля 2011

Рассмотрим следующий пример

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. Что такое запрос для поиска всех записей со словом «ell» в них из FT_Search. например,% ell% в родном полнотекстовом поиске H2

Ответы [ 2 ]

9 голосов
/ 10 июля 2011
  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 поддерживает групповой поиск поисков, хотя ведущие групповые символы (например, * ell), как правило, дороги.

4 голосов
/ 10 июля 2011

Должен ли я снова выполнить эту «ОБЩЕСТВЕННУЮ». «ТЕСТ» ГДЕ «ИД» = 1, чтобы получить запись, содержащую слово «Привет»?используйте соединение, как описано в trashgod.Причина в том, что строки обычно больше, чем два слова.Например, строка содержит CLOB с документом.Если результат полнотекстового поиска будет содержать данные, то полнотекстовый поиск будет намного медленнее.

Что такое запрос для поиска всех записей со словом 'ell' в них из FT_Search.например, как% ell% в собственном полнотекстовом поиске H2

Собственный полнотекстовый поиск не может сделать это напрямую.Причина в том, что полнотекстовый поиск индексирует только целые слова.(Между прочим: поддерживает ли Google поиск, если вы знаете только часть слова? Apache Lucene поддерживает его) На самом деле для H2 был бы способ: во-первых, поиск соответствий в таблице слов (FT.WORDS),а затем использовать обычный поиск.

...