MySQL fullständig textsökning

Idag spelade jag för att optimera en långsam SQL typ av begäran

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

Vart är den besvärande ena stunden här – de sista del ord % ‘ %’ och i ännu större konkretion tecken % före ordet, för det vi gör. Jokertecknet % ,innan något värde, vår ansökan översätter direkt direkt till en långsam, eftersom på detta sätt programmet stannar oss för att använda index av den. Som alltid finns det lösningar, men är inte alltid tydliga 😆 allmänt MySQL har du en lösning på problemet med fulltext Sök Indexering av den. Hur är ändringen av fältet det är en hel del skrivet i dokumentationen, men i en hast kommer jag att beskriva hur jag ändra topp begäran, eftersom vi kommer att få lite dramatik slutligen. Göra en söt som gäller för fulltext fältet upp, frågan behöver ändras i formuläret:

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

Så strukturen är uppenbara och det finns ingen anledning för onödig diskussion. Ovanstående fråga träder i kraft, Om ordet, som du gör en begäran minst 4 symbolen, Detta är standardvärdet, Om du vill ändra den, måste du ange värdet, която желаете в my.cnf в частта [mysqld] med deklarationen ft_min_word_len= 3 eller 2, 1 не е добър избор очевидно 😉 . När du ändrar värdet och starta om mysql server-behovet av att göra en reparation av tabeller, för nya indexering träder i kraft. Här rensa alla: ändrar du, Jag återställa, rebildvam index och göra min begäran och returnerar 0 Kontrollera med 😀

SHOW VARIABLES

Jag ser att värdena, Jag har frågat har trätt i kraft, rebildvam index igen – samma resultat. 🙄 Hat, mycket obehagligt. ОТ ТУК НАТАТЪК ЗАПОЧНА ЕДНО ГОЛЯМО РУГАЕНЕ И РОВЕНЕ ЗА КЛЮЧА ЗА БАРАКАТА 😀 КОЙТО СЕ ОКАЗА ДОСТА, ДОСТА ИНТЕРЕСЕН. КАТО ЦЯЛО, КАТО ЗАПОЧНАХ ДА ЧЕТА ДОКУМЕНТАЦИЯТА ЗА НЕ ЗНАМ КОЙ ПЪТ И СТИГНАХ ДО ЕДИН ИНТЕРЕСЕН ПАСАЖ

Such a technique works best with large collections (I själva verket, Det var noga anpassad hitåt). För mycket små bord, ordet distribution återspeglar inte tillräckligt deras semantiska värde, och denna modell kan ibland ge bisarra resultat. Till exempel, även om ordet "MySQL" är närvarande i varje rad i tabellen artiklar visades tidigare, en sökning på ordet ger inga resultat

ГРЕДА 😳 Дам табличката ми беше малка – Det var fortfarande ett test. I en stor applikation Naših tabell med över 2 000 000 ordning och där saker är sover. Det har väl redan klart problemet. För att klargöra lösningen, Jag kommer att kort nämna, att fulltext Sök stöd 3 Avancerade lägen BOOLEAN , UTTRYCK och NATURLIGT SPRÅK som den sista verken som standard. Om de olika lägen kan du kontrollera dokumentationen, Jag ska förklara med 2-3 ord till BOOLEAN eftersom det är nyckeln. Den stöder logiska operatorer av typen och, ELLER , INTE och så vidare och kan göra något magiskt med sökfraser, att ha en, är det en annan, etc.. Stöder och symbol *, Det är motsvarigheten till jokertecken % 😉 Det är användbar, När söktermen är i längden av den ft_min_word_len eller små brickor ;). Åtminstone för mig vid bordet med om 100 linjen gör ett perfekt jobb. Det enda som återstår att se och den färdiga ansökan:

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

Här kommer nu en tid indexering verk med oss jokertecken – svaret är inte vet jag. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

Förstärkt av Zemanta

2 comments

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

Lämna svar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade *

Anti SPAM *