DBAtlas · Veritabanı operasyon atlası

Tam metin arama (full-text search)

Oracle

-- Oracle Text: CONTEXT indeksi oluştur
CREATE INDEX makale_idx ON makale(icerik) INDEXTYPE IS CTXSYS.CONTEXT;
-- CONTAINS ile ara (3. parametre 1, SCORE(1) için etikettir):
SELECT id, SCORE(1) FROM makale
WHERE CONTAINS(icerik, 'veritabanı AND performans', 1) > 0
ORDER BY SCORE(1) DESC;

Oracle Text (eski adıyla interMedia) CONTEXT index'i ile dil bilinçli tam metin arama sağlar. CONTAINS operatörü AND/OR/NEAR gibi arama operatörlerini destekler. Index CTX_DDL.SYNC_INDEX veya otomatik SYNC ile güncellenir.

PostgreSQL

-- tsvector/tsquery ile arama, GIN indeksiyle hızlandır:
CREATE INDEX makale_fts_idx ON makale
  USING GIN (to_tsvector('turkish', icerik));
SELECT id, ts_rank(to_tsvector('turkish', icerik), q) AS skor
FROM makale, to_tsquery('turkish', 'veritabanı & performans') q
WHERE to_tsvector('turkish', icerik) @@ q
ORDER BY skor DESC;

PostgreSQL yerleşik tam metin arama tsvector (belge) ile tsquery (sorgu) türlerini @@ operatörüyle eşleştirir. GIN index'i büyük metinlerde aramayı hızlandırır. Dil sözlüğü ('turkish') kök bulma (stemming) ve stop-word işleme yapar.

MySQL

-- FULLTEXT indeks oluştur (InnoDB/MyISAM):
ALTER TABLE makale ADD FULLTEXT INDEX ft_icerik (icerik);
-- Doğal dil / boolean modda ara:
SELECT id, MATCH(icerik) AGAINST('veritabanı performans') AS skor
FROM makale
WHERE MATCH(icerik) AGAINST('+veritabanı +performans' IN BOOLEAN MODE);

MySQL FULLTEXT index'i MATCH ... AGAINST söz dizimiyle sorgulanır. IN NATURAL LANGUAGE MODE alaka skoru döndürür; IN BOOLEAN MODE +/-/* operatörleriyle hassas denetim sağlar. InnoDB tam metin aramayı 5.6'dan itibaren destekler.

SQL Server

-- Full-Text Catalog ve indeks oluştur:
CREATE FULLTEXT CATALOG ft_katalog;
CREATE FULLTEXT INDEX ON dbo.makale(icerik)
  KEY INDEX PK_makale ON ft_katalog;
-- CONTAINS / FREETEXT ile ara:
SELECT id FROM dbo.makale
WHERE CONTAINS(icerik, '"veritabanı" AND "performans"');

SQL Server Full-Text Search için önce Full-Text Catalog, sonra tablo üzerinde Full-Text Index gerekir (benzersiz KEY INDEX zorunlu). CONTAINS kesin/yakın arama ve mantıksal operatörleri, FREETEXT anlamsal (dil bazlı) aramayı destekler. Full-Text Search bileşeni kurulu olmalıdır.

MongoDB

// Metin (text) indeksi oluştur:
db.makale.createIndex({ icerik: "text" })
// $text ile ara ve alaka skoruna göre sırala:
db.makale.find(
  { $text: { $search: "veritabanı performans" } },
  { skor: { $meta: "textScore" } }
).sort({ skor: { $meta: "textScore" } })

MongoDB text index'i $text operatörüyle tam metin arama sağlar; koleksiyon başına yalnız bir text index'i olabilir. textScore meta alanı alaka düzeyini verir. Daha gelişmiş arama için Atlas Search ($search, Lucene tabanlı) kullanılır.

Redis

# RediSearch modülü (Redis Stack) gerektirir.
# İndeks tanımla:
FT.CREATE makale_idx ON HASH PREFIX 1 makale: SCHEMA icerik TEXT
# Tam metin ara:
FT.SEARCH makale_idx "veritabanı performans"

Çekirdek Redis tam metin arama sunmaz; RediSearch modülü (Redis Stack ile gelir) FT.CREATE ile index, FT.SEARCH ile arama sağlar. Kök bulma, fuzzy arama, filtreleme ve sıralama desteklenir. Modül kurulu değilse özellik kullanılamaz.

Elasticsearch

# Elasticsearch doğal olarak tam metin arama motorudur.
# match sorgusu (analiz edilmiş metin araması):
GET makale/_search
{
  "query": {
    "match": { "icerik": "veritabanı performans" }
  }
}

Elasticsearch temelde Lucene üzerine kurulu bir tam metin arama motorudur; text alanları indekslenirken analiz edilir (tokenizasyon, kök bulma). match sorgusu alaka skoruna (_score) göre sıralanmış sonuç döndürür. Türkçe için 'turkish' analyzer atanabilir.

DBAtlas'ta aç →