MySQL pełny tekst wyszukiwania

Dzisiaj grałem w celu optymalizacji powoli SQL wniosek od rodzaju

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

Gdzie trudnej chwili tutaj – najnowsza część ‘%word%’ i w jeszcze bardziej konkretny znak % przed słowem, dla co robimy. Wildcard symbol % ,do każdej wartości, jesteśmy zapytanie bezpośrednio przekształca się bezpośrednio w powoli, bo w ten sposób żądanie nie przeszkadza nam używać indeksów na polu. Decyzja, jak zawsze, ale nie zawsze jest jasne, 😆 w Ogóle MySQL masz rozwiązanie tego problemu fulltext search indeksowanie pól. Jak odbywa się zmiana skrzyni wiele jest napisane w dokumentacji, ale krótko opiszę, jak zmienia się ten wniosek, bo mamy mały teatr, w końcu. Zrobili jak stosuje się fulltext polu powyżej, wniosek powinien być zmiany w typie:

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

W ten sposób struktura jest oczywiste i nie wymaga zbędnych dyskusji. Ten wniosek będzie wchodzić w życie, jeśli słowo, dla której można zrobić wniosek, co najmniej 4 znaków, domyślna wartość, jeśli chcesz go zmienić, należy podać wartość, която желаете в my.cnf в частта [тузды] z wnioskiem ft_min_word_len=3 lub 2, 1 не е добър избор очевидно 😉 . Po tym jak zmienić wartość i ponownie uruchomić mysql server-a trzeba zrobić repair tabel go, do tego, aby nowy indeks weszły w życie. Tutaj wszystko jest jasne: robię zmiany, restart, ребилдвам indeksy i robię żądania i zwraca mi 0 kolejność 😀 Skonsultować się z

SHOW VARIABLES

Widzę, że wartości, zapytałem, weszła w życie, ребилдвам nie mniej, indeksy – ten sam wynik. 🙄 Niewygodne, bardzo niewygodne. Tu i dalej zaczęło się jedno wielkie ругаене i zadrapania klucza w stodole 😀 Który okazał się bardzo, dość ciekawy. W ogóle, jak zacząłem czytać dokumentację, nie wiem, w jaki sposób i doszedłem do ciekawych przejście

Such a technique works best with large collections (in fact, it was carefully tuned this way). For very small tables, word distribution does not adequately reflect their semantic value, and this model may sometimes produce results bizarre. For example, although the word "MySQL" is present in every row of the table articles shown earlier, a search for the word produces no results

ГРЕДА 😳 Дам табличката ми беше малка – to był test. Naszych żądań w jedną wielką tabelę z ponad 2 000 000 kolejność i tam rzeczy zdarzenie. No to jawna problem. Aby zrozumieć decyzję, pragnę zauważyć krótko, full text search obsługuje 3 tryb zaawansowany BOOLEAN , EXPRESSIONS i NATURAL LANGUAGE jako ostatni działa domyślnie. Dla różnych trybów można znaleźć w dokumentacji, wytłumaczę 2-3 kluczowe dla BOOLEAN, bo w nim chodzi. Obsługuje operatorów logicznych typu AND, OR , NOT i tak dalej, i można robić różne czary z popularnych zwrotów, jest, nie inny i tak dalej. Obsługuje i znaków *, co jest równoznaczne z symboli wieloznacznych % 😉 Jest to przydatne, gdy szukasz słowo pod wymiar ft_min_word_len lub małe zasobniki ;). Przynajmniej u mnie w tabeli około 100 linie są idealne. Pozostał tylko zobaczyć wypełniony wniosek:

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

Teraz przychodzi moment, czy będziemy pracować z szablonu indeksowania znaków – odpowiedź: nie wiem. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

Wzmocnione przez Zemanta

2 Komentarze

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

Zostaw odpowiedź

Twoj adres e-mail nie bedzie opublikowany. wymagane pola są zaznaczone *

anty spam *