DBAtlas · Atlas de operaciones de bases de datos

Búsqueda de texto completo

Oracle

-- Oracle Text: create a CONTEXT index
CREATE INDEX article_idx ON article(content) INDEXTYPE IS CTXSYS.CONTEXT;
-- Search with CONTAINS (label 1 ties CONTAINS to SCORE):
SELECT id, SCORE(1) FROM article
WHERE CONTAINS(content, 'database AND performance', 1) > 0
ORDER BY SCORE(1) DESC;

Oracle Text (antes interMedia) proporciona búsqueda de texto completo sensible al idioma mediante un índice CONTEXT. El operador CONTAINS admite operadores de búsqueda como AND/OR/NEAR. El índice se mantiene con CTX_DDL.SYNC_INDEX o con SYNC automático.

PostgreSQL

-- Search with tsvector/tsquery, accelerated by a GIN index:
CREATE INDEX article_fts_idx ON article
  USING GIN (to_tsvector('english', content));
SELECT id, ts_rank(to_tsvector('english', content), q) AS score
FROM article, to_tsquery('english', 'database & performance') q
WHERE to_tsvector('english', content) @@ q
ORDER BY score DESC;

La búsqueda de texto completo integrada de PostgreSQL compara tsvector (documento) con tsquery (consulta) mediante el operador @@. Un índice GIN acelera las búsquedas sobre textos grandes. La configuración de idioma ('english') realiza el stemming y el tratamiento de stop words.

MySQL

-- Create a FULLTEXT index (InnoDB/MyISAM):
ALTER TABLE article ADD FULLTEXT INDEX ft_content (content);
-- Search in natural language / boolean mode:
SELECT id, MATCH(content) AGAINST('database performance') AS score
FROM article
WHERE MATCH(content) AGAINST('+database +performance' IN BOOLEAN MODE);

Un índice FULLTEXT de MySQL se consulta con la sintaxis MATCH ... AGAINST. IN NATURAL LANGUAGE MODE devuelve una puntuación de relevancia; IN BOOLEAN MODE da un control detallado con los operadores +/-/*. InnoDB admite la búsqueda de texto completo a partir de 5.6.

SQL Server

-- Create a Full-Text Catalog and index:
CREATE FULLTEXT CATALOG ft_catalog;
CREATE FULLTEXT INDEX ON dbo.article(content)
  KEY INDEX PK_article ON ft_catalog;
-- Search with CONTAINS / FREETEXT:
SELECT id FROM dbo.article
WHERE CONTAINS(content, '"database" AND "performance"');

Full-Text Search de SQL Server necesita primero un Full-Text Catalog y luego un Full-Text Index en la tabla (es obligatorio un KEY INDEX único). CONTAINS admite búsqueda exacta/por proximidad y operadores lógicos; FREETEXT admite búsqueda por significado (lingüística). El componente Full-Text Search debe estar instalado.

MongoDB

// Create a text index:
db.article.createIndex({ content: "text" })
// Search with $text and sort by relevance score:
db.article.find(
  { $text: { $search: "database performance" } },
  { score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })

Un índice de texto de MongoDB proporciona búsqueda de texto completo mediante el operador $text; una colección solo puede tener un índice de texto. El metacampo textScore da la relevancia. Para búsquedas más avanzadas se usa Atlas Search ($search, basado en Lucene).

Redis

# Requires the RediSearch module (Redis Stack).
# Define the index:
FT.CREATE article_idx ON HASH PREFIX 1 article: SCHEMA content TEXT
# Full-text search:
FT.SEARCH article_idx "database performance"

Redis básico no ofrece búsqueda de texto completo; el módulo RediSearch (incluido en Redis Stack) proporciona la indexación con FT.CREATE y la búsqueda con FT.SEARCH. Se admiten stemming, búsqueda difusa, filtrado y ordenación. Sin el módulo instalado, la función no está disponible.

Elasticsearch

# Elasticsearch is natively a full-text search engine.
# match query (analyzed text search):
GET article/_search
{
  "query": {
    "match": { "content": "database performance" }
  }
}

Elasticsearch es fundamentalmente un motor de búsqueda de texto completo construido sobre Lucene; los campos text se analizan en tiempo de indexación (tokenización, stemming). La consulta match devuelve resultados ordenados por puntuación de relevancia (_score). Se pueden asignar analizadores específicos por idioma (p. ej., 'english').

Abrir en DBAtlas →