MySQL Fulde Tekst Søgning

I dag spillede jeg til optimering af langsom SQL ansøgning om form

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

Hvor er problemet her – den sidste del af ‘%ordet%’ og i en endnu mere specifik tegn % før ordet, for hvad vi gør. Wildcard symbol % ,til enhver værdi, vi anmoder om, direkte kan oversættes direkte til langsom, fordi denne måde forespørgslen ikke forhindre os i at bruge indekser på banen. Den løsning, som altid er, men det er ikke altid klart, 😆 i Almindelighed MySQL du har en løsning på dette problem fuldtekst-søgning indeksering felter. Da der er en ændring max en masse skrevet i den dokumentation,, men jeg vil kort beskrive, hvordan at ændre denne forespørgsel, fordi vi får en lille theater endelig. Vidste, hvordan man anvender fuldtekst boksen ovenfor, anmodningen skal være ændringer i den type:

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

Således strukturen er indlysende og behøver ingen unødvendig diskussion. Denne forespørgsel vil træde i kraft, hvis ordet, for, som du gør anmodningen, i det mindste 4 tegn, standardværdien, hvis du ønsker at ændre det, skal du angive en værdi, която желаете в my.cnf в частта [tusdi] en erklæring ft_min_word_len=3 eller 2, 1 не е добър избор очевидно 😉 . Når du har ændret værdien, og genstarte mysql server-du skal gøre reparation tabeller, for det nye indeks trådte i kraft. Her, alt er klar: Jeg foretage ændringer, genstart, rebeldom indeks og laver en forespørgsel og jeg vender tilbage 0 for 😀 Høre

SHOW VARIABLES

Jeg kan se, at de værdier, der er, Jeg spurgte, trådte i kraft, rebeldom, indekser – det samme resultat. 🙄 Ubehageligt, meget ubehageligt. Her, og så begyndte en stor Rogaine og ridser til en nøgle i skuret 😀, Som var meget, ganske interessant. Generelt, Jeg begyndte at læse den dokumentation, jeg ved ikke, hvad stien, og kom til en interessant passage

Such a technique works best with large collections (i virkeligheden, det var nøje afstemt denne måde). For meget små borde, ordet distribution ikke i tilstrækkelig grad afspejler deres semantiske værdi, og denne model kan nogle gange give bizarre resultater. For eksempel, selv om ordet "MySQL" er til stede i hver række af artikler tabellen tidligere, en søgning efter ordet giver ingen resultater

ГРЕДА 😳 Дам табличката ми беше малка – stadig, det var en test. Vores søgninger i en stor tabel med mere end 2 000 000 orden og ting hændelse. Dette er et indlysende problem. For at forstå den afgørelse,, Jeg bemærk kort, hvad betyder fuld tekst søg støtte 3 avanceret tilstand BOOLESK , UDTRYK og NATURLIGE SPROG som nyere værker som standard. Til forskellige tilstande kan findes i den dokumentation,, Jeg vil forklare 2-3 ord for BOOLEAN, fordi det handler om. Det understøtter logiske operatorer OG, ELLER , IKKE og så videre, og du kan gøre anderledes besværgelser med populære sætninger, der, ikke andet, og så videre. Støtter og symboler *, svarende til jokertegn % 😉 Dette er nyttigt, når du ledte efter ordet under den størrelse ft_min_word_len eller små skuffer ;). I det mindste har jeg bordet rundt 100 linjer er perfekt. Du er kun nødt til at se den færdige ansøgning:

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

Her kommer nu det øjeblik, om vi arbejder med et wildcard indeksering tegn – svar: det ved jeg ikke. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

Forstærket af Zemanta

2 kommentarer

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

efterlade et svar

Din e-mail-adresse vil ikke blive offentliggjort. Krævede felter er markeret *

Anti-SPAM *