全文搜索
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);MySQL FULLTEXT 索引通过 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"');SQL Server 全文搜索首先需要全文目录,然后在表上创建全文索引(必须有唯一的 KEY INDEX)。CONTAINS 支持精确/邻近搜索和逻辑运算符;FREETEXT 支持基于含义的(语言学)搜索。必须安装全文搜索组件。
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 索引通过 $text 运算符提供全文搜索;一个集合只能有一个 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')。