2011-07-10 21 views
7

Considere el siguiente ejemplo¿Cómo usar la BÚSQUEDA DE TEXTO COMPLETO en la base de datos 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); 

y voy a ejecutar la siguiente consulta

SELECT * FROM FT_SEARCH('Hello', 0, 0); 

Pero esta consulta está volviendo "público". "TEST", donde "ID" = 1.

  1. ¿Debo nuevamente ejecutar este "PUBLIC"."TEST" WHERE "ID"=1 para obtener el registro que contiene la palabra 'Hola'?
  2. ¿Cuál es la consulta para buscar todos los registros con la palabra 'ell' en ellos de FT_Search. como por ejemplo como% ell% en H2 nativo búsqueda de texto

Respuesta

8
  1. Sí, cada fila de una consulta utilizando FT_SEARCH representa un esquema-table-row, donde se encontró una de las palabras clave. La búsqueda no distingue entre mayúsculas y minúsculas, y el parámetro text a FT_SEARCH puede incluir más de una palabra. Por ejemplo,

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

    sólo devuelve la fila tres:

    QUERY       SCORE 
    "PUBLIC"."TEST" WHERE "ID"=3 1.0 
    

    También tenga en cuenta que FT_SEARCH_DATA puede utilizarse para recuperar los datos en sí. Por ejemplo,

    SELECT T.* FROM FT_SEARCH_DATA('hello', 0, 0) FT, TEST T 
    WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0]; 
    

    rendimientos ambas filas que contienen la palabra clave:

    ID NAME 
    1 Hello World 
    3 Hello Goodbye 
    
  2. Apache Lucene apoya wildcard búsquedas, aunque líder comodines (por ejemplo * ell) tienden a ser caros.

+0

Eso es exactamente lo que quiero. Gracias. – Vivek

+0

otra vez hay alguna manera de indexar la base de datos h2 con lucene si alguno dime. – Vivek

+0

[Usando la búsqueda de texto completo de Lucene] (http://www.h2database.com/html/tutorial.html#fulltext) es muy similar, solo necesita las libs de Lucene en su classpath. – trashgod

3

¿Tengo que volver a ejecutar este "público". "TEST", donde "ID" = 1 para obtener el registro que contiene la palabra 'Hola'?

Sí, excepto si usa una combinación como se describe en trashgod. La razón es que, por lo general, las filas son mucho más grandes que solo dos palabras. Por ejemplo, una fila contiene un CLOB con un documento. Si el resultado de la búsqueda de texto completo contiene los datos, la búsqueda de texto completo sería mucho más lenta.

¿Cuál es la consulta para buscar todos los registros con la palabra 'ell' en ellos de FT_Search. como%% ell% en H2 Búsqueda nativa de texto

La búsqueda de texto completo nativo no puede hacer eso directamente. El motivo es: la búsqueda de texto completo solo indexa palabras completas. (Por cierto: ¿las búsquedas de soporte de Google si solo conoces una parte de una palabra? Apache Lucene sí lo admite) En realidad, para H2, habría una manera: primero, busca en la tabla de palabras (FT.WORDS) las coincidencias, y luego usa una búsqueda regular.

+0

Sí, Lucene admite [comodín] (http://wiki.apache.org/lucene-java/LuceneFAQ#What_wildcard_search_support_is_available_from_Lucene.3F); Arreglé el enlace (previamente) roto en mi respuesta. Buena idea para buscar 'FT.WORDS' para partidas parciales. – trashgod

+0

En realidad, debido a que la búsqueda regular de texto completo conecta los términos de búsqueda usando AND, simplemente buscar resultados de FT.WORDS en una sola consulta puede no funcionar. Supongamos que desea buscar 'AB%', una consulta FT.WORDS puede devolver 'ABCDE' y' ABXYZ' como candidatos de palabra. Ahora una búsqueda regular de texto completo para 'ABCDE ABXYZ' devolverá la intersección, probablemente el conjunto vacío. Para utilizar el enfoque FT.WORDS, primero debe expandir su término 'AB%' y luego llamar a la búsqueda de texto completo para cada expansión. Y si tiene varios términos de búsqueda, tendrá que buscar * todas las combinaciones *. – hendrik

Cuestiones relacionadas