全文検索
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 の Full-Text Search では、まず 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 インデックスは $text 演算子による全文検索を提供する。コレクションに持てる text インデックスは 1 つのみ。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')を割り当てられる。