MySQL Cookbook by

Diskuse

Pro vyhledání záznamů, které obsahují určitou frázi, nelze použít jednoduché FULLTEXTvyhledávání:

mysql>  -> +----------+| COUNT(*) |+----------+| 548 |+----------+

Dotaz vrátí výsledek, ale není to hledaný výsledek. Vyhledávání FULLTEXTvypočítá pořadí relevance na základě přítomnosti každého slova jednotlivě, bez ohledu na to, kde se ve sloupcivtext vyskytuje, a pořadí bude nenulové, dokud se některé ze slov vyskytuje. V důsledku toho má tento druh dotazu tendenci najít příliš mnoho záznamů.

Od verze MySQL 4.0.2 podporuje FULLTEXTvyhledávání frází v logickém režimu. Chcete-li jej použít, stačí umístit frázi do dvojitých uvozovek.

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Před verzí 4.0.2 je nutné řešení. Mohli byste použít vyhledáváníIN BOOLEANMODE, které vyžaduje přítomnost každého slova,ale to problém ve skutečnosti neřeší, protože slova se stále mohou vyskytovat v libovolném pořadí:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 3 |+----------+

Pokud místo toho použijete SQL porovnání vzorů, vrátí se správný výsledek:

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Použití SQL porovnání vzorů je však pravděpodobně pomalejší než vyhledáváníFULLTEXT. Zdá se tedy, že máte nepříjemnou volbu, zda použít metodu, která je rychlejší, ale nevytváří požadované výsledky, nebo metodu, která funguje správně, ale je pomalejší. Naštěstí to nejsou jediné možnosti. Obě metody můžete kombinovat v jednom dotazu:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Tím získáte to nejlepší z obou typů porovnávání:

  • Pomocí výrazu MATCH( ) může MySQL provést vyhledáváníFULLTEXT a vytvořit sadu kandidátních řádků, které obsahují slova ve frázi. Tím se vyhledávání výrazně zúží.

  • Pomocí testu vzoru SQL může MySQL prohledat kandidátní řádky a vytvořit pouze ty záznamy, které mají všechna slova uspořádaná ve správném pořadí.

Tato technika selže, pokud jsou všechna slova menší než minimální délka slova indexovacího stroje nebo se vyskytují ve více než polovině záznamů. V takovém případě FULLTEXTvyhledávání nevrátí vůbec žádné záznamy. Záznamy můžete najít pomocí shody se vzoremSQL.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.