T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
26th February

MySQL iskanje LIKE vs FULL-TEXT

MySQL omogoča dva načina iskanja po tabelah in sicer z LIKE ter FULL-TEXT.

#1: LIKE
[mysql]
SELECT `ime_osebe` FROM `seznam_oseb` WHERE `ime_osebe`=’%rok%’ OR `ime_osebe`=’R%’ OR `ime_osebe`=’R__’ OR `ime_osebe`=’%ok’
[/mysql]

#2: FULL-TEXT
[mysql]
SELECT `ime_osebe` FROM `seznam_oseb` MATCH(`content`) AGAINST(‘Rok’)
[/mysql]

#1 LIKE:

  • ‘%ok‘ => ‘Karkoli ok‘ (Karkoli => poljubno število poljubnih znakov pred “ok“, Rok, blablaok, ToSemJazRok, 1okolist, …)
  • ‘_ok‘ => ‘X ok‘ (X => točno en poljubni znak pred “ok“, torej celotna beseda mora biti dolžine tri, Rok, Xok, Kok, Mok, …)
  • SELECT 500 LIKE ‘5%’ => Možnost uporabe na številkah (ni potrebno, da iščemo po polju VARCHAR, CHAR, TEXT ampak tudi INT, itd)

Več informacij o LIKE.

Problem pri LIKE je v tem, da v primeru, ko iščemo po vsebini za manjše besede (dolžine 3 ali manjše), vrne skoraj vse vrstice. Primer, “in” je prisoten v skoraj vseh stavkih, zato nam bo MySQL kot rezultat vrnil skoraj vso vsebino oz. vrstice z vsebino, ki vsebuje ‘in’.

Tukaj nastopi FULL-TEXT, ki (vsaj kakor je meni znano) deluje le na MyISAM tabelah. Na srečo obstajajo dodatki, kot je Sphinx Search Egine, ki dodajo podporo tudi za inno tabele. FULL-TEXT značilnost:

  • avtomatsko sortira rezultate po relevanci (bolj relevantni zadetki so na vrhu)
  • deluje le na CHAR, VARCHAR, ali TEXT tipu
  • potrebuje FULL-TEXT index (ALTER TABLE `tabela` ADD FULLTEXT (`ime_polja`))
  • če se iskana beseda pojavi v več kot 50% vseh vrstic potem MySQL vrne prazen rezultat
  • obstaja splošna datoteka z pogostimi besedami jezika (npr: the, we, are). Če stopword datoteka vsebuje naš iskalni niz bo MySQL vrnil prazno množico. Stopword datoteko lahko povozite z svojo z ukazom: ft_stopword_file
  • privzeto iskalne nize manjše od 4 in daljše od 10 ne upošteva, je pa možno to spremeniti z ft_max_word_len in ft_min_word_len. V primeru spremembe morate FULL-TEXT index ponovno zgraditi, lahko z ukazom REPAIR TABLE table QUICK, vendar se včasih zgodi, da potem MySQL vrača čudne rezultate. Rešitev zato je odstranitev FULL-TEXT indexa in ponovno dodajane FULL-TEXT indexa.
  • je hitrejši kot LIKE

Dodatne informacije za FULL-TEXT:

Primer rezultatov za majhne iskalne niz, v mojem primeru: se

FULL-TEXT (1 vrstica izmed 70):

Projects
Enterprise class IT security project services for any size of business. All security projects delivered by the security Practice follow our Assess, Design, …

LIKE (70 vrstic izmed 70):

ISO27001
Reach for the ultimate security standard If you want to be setting the standard in private or public sector IT security, then you need ISO27001. Certification …

Our Technology
How we use technology to make us the best in the business. We Practice What We Preach. If we recommend a solution to our clients, then we’ll be using it …

We cannot compete with these companies and be the best at delivering IT service to our clients – so we don’t try. We realise that we can deliver value to our …

Tudi na splošno FULL-TEXT iskanje vrne bolj primerne rezultate, ki vsebujejo informacijo za katero je večja verjetnost, da jo uporabnik išče kot pri LIKE načinu iskanja.

Delodajalec: Pangaea.si


2x komentirano na “MySQL iskanje LIKE vs FULL-TEXT”

  1. Dejan je napisal:

    WHERE `ime_osebe` like ‘%rok%’ ;)

  2. Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki – mysql like | T&R splet - internetne storitve je napisal:

    [...] LIKE – MATCH AGAINST [...]

Dodaj komentar

You must be logged in to post a comment.