Полнотекстовый поиск
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 (ранее interMedia) обеспечивает полнотекстовый поиск с учётом языка через индекс CONTEXT. Оператор CONTAINS поддерживает операторы поиска вроде AND/OR/NEAR. Индекс поддерживается через CTX_DDL.SYNC_INDEX или автоматический SYNC.
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;Встроенный полнотекстовый поиск PostgreSQL сопоставляет tsvector (документ) с tsquery (запрос) оператором @@. Индекс GIN ускоряет поиск по большим текстам. Языковая конфигурация ('english') выполняет стемминг и обработку стоп-слов.
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);Индекс FULLTEXT в MySQL запрашивается синтаксисом MATCH ... AGAINST. IN NATURAL LANGUAGE MODE возвращает оценку релевантности; IN BOOLEAN MODE даёт тонкий контроль операторами +/-/*. InnoDB поддерживает полнотекстовый поиск начиная с 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 в SQL Server сначала нужен Full-Text Catalog, затем Full-Text Index на таблице (уникальный KEY INDEX обязателен). CONTAINS поддерживает точный поиск/поиск по близости и логические операторы; FREETEXT — смысловой (лингвистический) поиск. Компонент Full-Text Search должен быть установлен.
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" } })Текстовый индекс MongoDB обеспечивает полнотекстовый поиск через оператор $text; у коллекции может быть только один текстовый индекс. Мета-поле textScore даёт релевантность. Для более продвинутого поиска используется Atlas Search ($search, на основе 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 не предлагает полнотекстового поиска; модуль RediSearch (входит в Redis Stack) обеспечивает индексацию через FT.CREATE и поиск через FT.SEARCH. Поддерживаются стемминг, нечёткий поиск, фильтрация и сортировка. Без установленного модуля функция недоступна.
Elasticsearch
# Elasticsearch is natively a full-text search engine.
# match query (analyzed text search):
GET article/_search
{
"query": {
"match": { "content": "database performance" }
}
}Elasticsearch по сути — полнотекстовый поисковый движок на основе Lucene; поля text анализируются при индексации (токенизация, стемминг). Запрос match возвращает результаты, отсортированные по оценке релевантности (_score). Можно назначать языковые анализаторы (напр. 'english').