MySQL Full tekstsøk

I dag jeg spilte for å optimalisere en langsom SQL forespørselstype

SELECT * FROM 'table' WHERE `field` LIKE '%word%'

Hvor er den plagsom ett øyeblikk her – de siste del ord % ‘ %’ og i enda større concreteness tegn % før ordet, for at vi gjør. Jokertegn % ,før noen verdi, vårt program oversettes direkte direkte til en langsom, fordi på denne måten programmet stopper oss å bruke indeksene av den. Som alltid finnes det løsninger, men er ikke alltid klart 😆 generelt MySQL du har en løsning på problemet med fulltekst-søk Indeksering av den. Hvordan er det feltet det er mye skrevet i dokumentasjonen, men i hast vil jeg beskrive hvordan jeg endre topp forespørselen, fordi vi vil få litt drama endelig. Utgjør en søt som gjelder for fulltext feltet, spørringen må endres i skjemaet:

SELECT * FROM `table` WHERE MATCH (field) AGAINST ('word')

Så er åpenbare, og det er ikke nødvendig for unødvendig diskusjon. Det over spørsmål trer i kraft, Hvis ordet, som du gjør en forespørsel minst 4 symbolet, Dette er standardverdien, Hvis du vil endre den, må du angi verdien, която желаете в my.cnf в частта [mysqld] med erklæringen ft_min_word_len= 3 eller 2, 1 не е добър избор очевидно 😉 . Når du endrer verdien og starte mysql server-behov for å gjøre en reparasjon av tabeller, for at nye indekseringen trer i kraft. Her alt klart: du vil endre, Jeg restarte, rebildvam indekser og gjøre min forespørsel og returnerer 0 Sjekke linje med 😀

SHOW VARIABLES

Jeg ser at verdiene, Jeg har spurt har trådte i kraft, rebildvam indekser igjen – samme resultat. 🙄 Hat, veldig ubehagelig. ОТ ТУК НАТАТЪК ЗАПОЧНА ЕДНО ГОЛЯМО РУГАЕНЕ И РОВЕНЕ ЗА КЛЮЧА ЗА БАРАКАТА 😀 КОЙТО СЕ ОКАЗА ДОСТА, ДОСТА ИНТЕРЕСЕН. КАТО ЦЯЛО, КАТО ЗАПОЧНАХ ДА ЧЕТА ДОКУМЕНТАЦИЯТА ЗА НЕ ЗНАМ КОЙ ПЪТ И СТИГНАХ ДО ЕДИН ИНТЕРЕСЕН ПАСАЖ

Such a technique works best with large collections (faktisk, Det var finjusteres slik). For svært små tabeller, ordet distribusjon ikke gjenspeiler deres semantiske verdi, og denne modellen kan noen ganger gi bisarre resultater. For eksempel, Selv om ordet "MySQL" finnes i hver rad i tabellen artikler vist tidligere, et søk etter ordet gir ingen resultater

ГРЕДА 😳 Дам табличката ми беше малка – Det var fortsatt en test. I en stor program Naših tabell med over 2 000 000 orden og ting er sover. Vel er det allerede klart problemet. Å gjøre det klart løsningen, Jeg vil nevne kort, som full tekst søk støtter 3 Avansert modus BOOLSK , UTTRYKK og NATURLIG SPRÅK som siste verk som standard. Om de ulike modiene kan du sjekke dokumentasjonen, Jeg skal forklare med 2-3 ord til boolsk fordi det er nøkkelen. Den støtter logiske operatorer av type og, ELLER , IKKE og så videre, og kan gjøre noe magisk med søkeordene, å ha en, er det en annen, etc.. Støtter og symbol *, som tilsvarer jokertegn % 😉 Det er nyttig, Når søkeordet er lengden på den ft_min_word_len eller lille skuffer ;). Minst for meg ved bordet med om 100 linjen gjør en perfekt jobb. Eneste igjen å se og det ferdige programmet:

SELECT * FROM `table` WHERE MATCH (field)
AGAINST ('*word*' IN BOOLEAN MODE)

Nå kommer her en tid indeksering fungerer med oss jokertegn – Svaret er jeg ikke vet. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

Forbedret lenker:

2 kommentarer

    1. Е при големи таблици вече има други решения 😉 partitions да речем или други механизмни за fulltext search като Sphinx

legg igjen et svar

Din epostadresse vil ikke bli publisert. Obligatoriske felt er merket *

Anti SPAM *