MySQL pilna teksta meklēšana
Sveiki! Esmu uztaisījis nelielu rakstu lietpratējiem. Cerams, ka kādam, kas strādā ar MySQL DBVS, tas noderēs.
Ja tīmekļa vietnē nepieciešams organizēt teksta balstītu meklēšanu, tad MySQL piedāvā gatavu risinājumu meklēšanas vienkāršošanai un efektivitātes celšanai. Standarta SQL valodas risinājums simbolu virknes meklēšanai datu bāzes tabulas laukā ir LIKE nosacījums. Diemžēl, šī metode ir ļoti neefektīva, jo meklējamā simbolu virkne tiek salīdzināta ar visām tabulas lauka rindām.
MySQL MyISAM datu glabāšanas dzinējs tabulu laukiem ar teksta datu tipiem ļauj veidot pilna teksta indeksu (FULLTEXT), kuru var pievienot, veidojot tabulu, vai arī vēlāk. MySQL pilna teksta meklēšana var tikt veikta tikai tabulas laukos, kuriem ir pilna teksta indekss. Meklēšanai tiek izmantota MATCH() … AGAINST sintakse, kur MATCH() iekļauj ar komatiem atdalītus tabulas laukus, kuros tiks meklēts teksts, bet AGAINST iekļauj meklējamo simbolu virkni un izvēles modifikatoru, kurš nosaka meklēšanas tipu (pastāv 3 tipi). Meklējamā simbolu virkne nedrīkst būt mainīgais vai tabulas lauka nosaukums.
Piemēram, ja pastāv tabula ar teksta laukiem “virsraksts” un “teksts”, tad MySQL pilnā teksta meklēšana šiem laukiem izskatītos sekojoši:
SELECT virsraksts, teksts FROM tabula WHERE MATCH (virsraksts, teksts) AGAINST (‘meklējamie vārdi’);
Ja netiek izmantots meklēšanas tipa modifikators, pēc noklusējuma tiek izmantots dabīgās valodas meklēšanas tips (natural language search), un uzdotā simbolu virkne tiks meklēta kā vesels atslēgas vārds. Ja meklējamā simbolu virkne būs sastopama vairāk nekā 50% meklējamo lauku rindās, tad atslēgas vārds tiks uztverts kā parasts un tiks ignorēts.
Otrs meklēšanas režīms ir vaicājuma paplašināšanas meklēšana (query expansion search), kur tiek meklētas ne tikai atslēgas vārdiem atbilstošas lauku rindas, bet arī ar meklēšanas rezultātiem saistītas lauku rindas. Piemēram, ja tiek meklēta frāze “DBVS”, tad MySQL meklēšanas rezultātos parādīsies lauku rindas, kuru teksti satur “DB2 DBVS”, “IBM DB2 Manual”, “Bercley DBVS”, “Bercley University”, “DBVS sistēmas”, “Biznesa vadības sistēmas” u.tml. Šis meklēšanas režīms tiek ieslēgts ar WITH QUERY EXPANSION modifikatora palīdzību, un meklēšana šajā režīmā izskatās sekojoši:
SELECT virsraksts, teksts FROM tabula WHERE MATCH (virsraksts, teksts) AGAINST (‘meklējamie vārdi’ WITH QUERY EXPANSION);
Trešais meklēšanas režīms ir Būla meklēšana (Boolean search). Šis meklēšanas režīms interpretē meklējamo simbolu virkni ar speciālo operatoru palīdzību. Būla meklēšanas režīms tiek ieslēgts ar IN BOOLEAN MODE modifikatora palīdzību. Šajā meklēšanas režīmā daži simboli pārvēršas par operatoriem (skat. Tabula 1). Netiešā Būla loģika tiek realizēta, izmantojot simbolu “+” kā JĀ, simbolu “-” kā NĒ, bet atstarpi jeb tukšuma zīmi kā VAI. Būla meklēšanas režīmam ir sekojošas svarīgākās īpašības:
- Var noteikt minimālo un maksimālo meklējamo vārdu garumu
- Meklēšanas rezultāts pēc noklusējuma netiek kārtots pēc sakritības
- Var darboties bez pilna teksta indeksa (tādā gadījumā manāmi zemāka veiktspēja)
- Meklējamie vārdi, kas parādās biežāk par 50%, netiek ignorēti
| Operators | Nozīme |
| “ | Ar pēdiņu palīdzību meklējamā simbolu virknē blakus esošus vārdus var apvienot vienā veselā un meklēšanas laikā tiks meklēta tieši frāze, kas atrodas pēdiņās. Piemēram, ja meklēsim simbolu virkni pavasaris nāk, tad meklēšanas rezultātos parādīsies arī tās lauku rindas, kuras atsevišķi satur kādu no šiem vārdiem. Ja tiks meklēta simbolu virkne “pavasaris nāk”, tad rezultātos būs tikai tās rindas, kuras satur doto frāzi. |
| * | Zvaigznīte kalpo par aizstājējzīmi. Tas nozīmē, ka meklējamie vārdi, kuri beidzas ar zvaigznīti, tiek interpretēti kā priedēkļi, bet vārdi, kuri sākas ar zvaigznīti – kā piedēkļi. Piemēram, ja meklējamā simbolu virkne ir *diena, tad meklēšanas rezultātos parādīsies arī rindas ar visām nedēļas dienām vai jebkuriem citiem vārdiem, kuri beidzas ar “diena”. Ja tiks meklēta simbolu virkne mašīn*, tad rezultātos parādīsies rindas, kuras satur vārdus “mašīnbūve”, “mašīnas” u.tml. |
| ~ | Tildes simbols asociējas ar negāciju. Ja meklētie vardi sāksies ar tildi, tie būs novērtēti zemāk, nekā vārdi bez tildes. |
| - | Mīnusa zīme tiek interpretēta kā NĒ, un no meklēšanas rezultātiem tiek izslēgti visi vārdi, kuri sākas ar šo zīmi. |
| + | Plusa zīme tiek interpretēta kā JĀ, un meklēšanā tas nozīmē, ka katrā lauka rindā, kurā ir šis vārds, obligāti jābūt šim vārdam. |
| () | Iekavas nozīmē atsevišķu bloku ar saviem operatoriem |
| > < | Šīs zīmes kalpo kā svarīguma operatori meklējamo vārdu sākumā. |
Tabula 1: Būla meklēšanas režīma operatori
Daži piemēri:
SELECT virsraksts, teksts FROM tabula WHERE MATCH (virsraksts, teksts) AGAINST (‘meklējamie vārdi’ IN BOOLEAN MODE);
Pēc šī vaicājuma izpildes tiks izdots rezultāts, kurš satur vismaz vienu no meklētajiem vārdiem. Ja meklējamā simbolu virkne būs +(>zaļie <sarkanie) +āboli, tad meklēšanas rezultātā būs visas rindas, kuras saturēs frāzes “zaļie āboli” un “sarkanie āboli”. “Zaļie āboli” tiks novērtēti augstāk un parādīsies pirmie, bet “sarkanie āboli” būs rezultāta beigās. Ja tiks meklēta simbolu virkne -zaļie +āboli, rezultātā būs visas rindas, kurās ir vārds āboli, bet frāzes “zaļie āboli” tiks pilnībā izslēgtas.
Ja radās interese, iesaku palasīt sīkāk MySQL dokumentācijā un uzgooglēt dažus piemērus.









Spēcīgs raksts, domāju, ka ļoti noderīgs cilvēkiem, kas pielieto šo DB un programmē savu meklēšanas moduli mājas lapai