Filip Majerík | 2026
| Typ | Příklady | Vhodné použití |
|---|---|---|
| Relační | MySQL, PostgreSQL, OracleDB | Transakční systémy, vazby mezi daty, konzistence |
| Key-Value | Redis, DynamoDB | Cache, session, velmi rychlý přístup k datům |
| Dokumentové | MongoDB, Couchbase | Flexibilní struktura dat, JSON dokumenty |
| Sloupcové | Cassandra, HBase | Velké objemy dat, horizontální škálování, vysoká dostupnost, rychlé zápisy |
| Search engine | Elasticsearch, OpenSearch | Fulltextové vyhledávání, relevance, agregace |
→ DBS vždy volíme podle konkrétního use-casu a požadavků.
→ Jak tohle efektivně vyřešit?
SELECT *
FROM movies
WHERE title LIKE '%sta wrs%';
SELECT *
FROM movies
WHERE MATCH(title) AGAINST ('sta wrs');
FT.CREATE movies_idx ON HASH PREFIX 1 "movie:"
SCHEMA
title TEXT
description TEXT
FT.SEARCH movies_idx "sta wrs"
db.movies.createIndex({
title: "text",
description: "text"
});
db.movies.find({
$text: { $search: "sta wrs" }
});
db.movies.aggregate([
{
$search: {
text: {
query: "sta wrs",
path: ["title", "description"]
}
}
}
]);
→ potřebujeme nástroj navržený přímo pro vyhledávání
PUT /program
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
number_of_shards: 3 → index se rozdělí na 3 primární shardynumber_of_replicas: 1 → každý primární shard
bude mít 1 repliku
celkem shardů = primární shardy × (1
+ počet replik)
Star Wars → star, wars
War of Worlds → war, worlds
Star Trek → star, trek
----------------------------
star → doc1, doc3
wars → doc1
war → doc2
worlds → doc2
trek → doc3
1 → [kočka, sedí, na, střeše, domu]
2 → [malá, kočka, seděla, na, střeše]
3 → [kočky, sedí, na, střechách, domů]
4 → [na, střeše, domu, sedí, černá, kočka]
5 → [kočka, právě, sedí, na, střeše, starého, domu]
kočka / kočky → kočk
sedí / seděla → sed
střeše / střechách → střech
domu / domů → dom
kočk → [1, 2, 3, 4, 5]
sed → [1, 2, 3, 4, 5]
střech → [1, 2, 3, 4, 5]
dom → [1, 3, 4, 5]
malá → [2]
černá → [4]
starý → [5]
právě → [5]
Star Wars v indexu neznamená, že najdeme i str wrs.
str wrs nemusí nic najít?
Star Wars → star, wars
str wrs → str, wrs
--------------------
str → ?
wrs → ?
→ Výsledek: nic
a, the, je, tostr wrs → pořád str, wrs
str wrs stále není validní slovostr wrs → stále nicstar → st, sta, star…
str wrs už se může
částečně potkat s indexem
str wrs → s velkou
pravděpodobností nicstr wrs stále nemusí stačit na star wars
str wrssqtr wsrsstr → blízko star → vzdálenost 1
(doplní a)
wrs → blízko wars → vzdálenost 1
(doplní a)
sqtr → blízko star→ vzdálenost 2
(odebere q, přidá a)
wsrs → blízko wars→ vzdálenost 1
(prohodí s a a)
str wrs → star wars
// varianta 1 — inline (caret ^)
{
"multi_match": {
"query": "ulice",
"fields": [
"title^3",
"description"
]
}
}
// varianta 2 — explicitní boost
{
"match": {
"title": {
"query": "ulice",
"boost": 3
}
}
}
Celý index: 1000 filmů
Subset: 100 akčních filmů
'exploze':
→ v celém indexu: 50×
→ v subsetu: 40×
=> nečekaně vysoký výskyt (80% dokumentů) → significant
Celý index: 1000 filmů
'film':
→ v celém indexu: 900×
→ v subsetu: 10×
=> normální výskyt (~1% dokumentů) → non-significant
Dotaz: Chci znát pro každý rok film,
který nejlépe odpovídá výrazu: 'terminator'
Výsledky:
* 1984 - Terminátor - 87 %
* 1991 - Terminátor 2: Den zúčtování - 91 %
* 2003 - Terminátor 3: Vzpoura strojů - 74 %
* 2007 - Hra s časem - 20 %
* 2009 - Terminator Salvation - 67 %
* 2015 - Terminator Genesys - 66 %
* 2019 - Terminátor: Temný osud - 67 %
žánr → rok →
země
Dotaz: Chci znát počet filmů
dle žánru a následně dle let v kterých vyšly.
1000 filmů
├─ Akční: 500
│ ├─ 1980s: 120
│ ├─ 1990s: 180
│ └─ 2000s: 200
│
├─ Sci-fi: 300
│ └─ ...
└─ Komedie: 200
└─ ...
Terminátor 2