Czasami podczas wyszukiwania w bazie danych MySQL możesz chcieć uruchomić zapytania wyszukiwania pełnotekstowego w odniesieniu do danych znakowych. Dzisiaj omawiamy zalety i wady takich metod wyszukiwania.
Co to jest wyszukiwanie pełnotekstowe w MySQL?
Wyszukiwanie pełnotekstowe to technika, która umożliwia wyszukiwanie rekordów, które mogą nie pasować idealnie do kryteriów wyszukiwania. Wyszukiwanie pełnotekstowe w MySQL jest wykonywane, gdy używane są pewne indeksy, a te indeksy mają wiele unikalnych niuansów, w tym:
- Aby indeks był uważany za indeks pełnotekstowy, indeks musi być typu FULLTEXT.
- Indeksy FULLTEXT mogą być używane tylko w tabelach z silnikami pamięci masowej InnoDB lub MyISAM.
- Indeksy FULLTEXT można tworzyć tylko dla kolumn CHAR, VARCHAR lub TEXT.
- Indeksy FULLTEXT są używane tylko wtedy, gdy używana jest klauzula MATCH() AGAINST().
- Wyszukiwania pełnotekstowe mają trzy tryby:tryb języka naturalnego, tryb logiczny i tryb rozszerzania zapytania.
Indeks FULLTEXT to specjalny typ indeksu, który znajduje słowa kluczowe w tekście zamiast porównywać wartości z wartościami w indeksie. Chociaż wyszukiwanie FULLTEXT różni się od innych typów dopasowywania, pamiętaj, że możesz mieć indeks BTREE i indeks FULLTEXT w tej samej kolumnie w tym samym czasie — nie będą one powodować konfliktów, ponieważ są przystosowane do różnych celów.
Typy wyszukiwania pełnotekstowego
Podczas wyszukiwania pełnotekstowego w MySQL należy pamiętać, że do wyboru są trzy typy wyszukiwania:
- Typ wyszukiwania w języku naturalnym — taki tryb wyszukiwania interpretuje wyszukiwany ciąg jako dosłowną frazę. Domyślnie włączone, jeśli nie określono modyfikatora lub gdy określono modyfikator W TRYBIE JĘZYKA NATURALNEGO;
- Typ wyszukiwania z rozszerzeniem zapytania — taki tryb wyszukiwania przeprowadza wyszukiwanie dwukrotnie. Podczas wyszukiwania po raz drugi zestaw wyników zawiera kilka najbardziej odpowiednich dokumentów z pierwszego wyszukiwania. Włączone za pomocą modyfikatora WITH QUERY EXPANSION;
- Typ wyszukiwania boolowskiego - taki tryb wyszukiwania umożliwia wyszukiwanie złożonych zapytań, które mogą zawierać operatory logiczne, takie jak operatory mniej niż („<”) i więcej niż („>”), podwyrażenia („( ” i „)”), znak plusa (+), znak minusa (-), cudzysłowy („”), operator obniżający udział wartości w wynikach (~) oraz operator symboli wieloznacznych (*) — operator symboli wieloznacznych umożliwia wyszukiwanie z rozmytym dopasowaniem (na przykład „demo*” pasuje również do „demonstracji”). Włączone za pomocą modyfikatora W TRYBIE BOOLEAN.
Wyszukiwanie pełnotekstowe w trybie wyszukiwania w języku naturalnym
Tryb wyszukiwania w języku naturalnym, jak wspomniano powyżej, jest domyślnie włączony lub gdy określony jest modyfikator IN NATURAL LANGUAGE MODE. Ten tryb przeprowadza wyszukiwanie w języku naturalnym w danym zbiorze tekstu (jedna lub więcej kolumn). Podstawowy format zapytań wyszukiwania pełnotekstowego w MySQL powinien być podobny do następującego:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);
Gdy funkcja MATCH() jest używana razem z klauzulą WHERE, wiersze są automatycznie sortowane najpierw według najwyższej trafności. Aby wyszukać dokładny ciąg, umieść go w podwójnych cudzysłowach.
Wyszukiwanie pełnotekstowe w trybie rozszerzenia zapytania
Wyszukiwania pełnotekstowe obsługują również tryb rozszerzania zapytań. Taki tryb wyszukiwania jest często używany, gdy użytkownik polega na wiedzy domniemanej – na przykład użytkownik może wyszukiwać „DBMS”, mając nadzieję, że w wynikach wyszukiwania zobaczy zarówno „MongoDB”, jak i „MySQL”. Powód, dla którego użytkownik może polegać na pewnej domniemanej wiedzy podczas korzystania z takiego trybu wyszukiwania, jest dość prosty — wyszukiwanie pełnotekstowe w trybie rozszerzania zapytania działa poprzez dwukrotne wykonanie wyszukiwania:druga fraza wyszukiwania jest pierwszą frazą wyszukiwania połączone z kilkoma najbardziej trafnymi wpisami z pierwszego wyszukiwania. Oznacza to, że na przykład jeśli w pierwszym wyszukiwaniu jeden z wierszy zawierałby słowo „DBMS” i słowo „MySQL”, drugie wyszukiwanie znalazłoby wpisy zawierające słowo „MySQL”, nawet jeśli nie zawierają „SZBD”. Format zapytania, który używałby trybu rozszerzania zapytania, wyglądałby tak:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION);
Wyszukiwanie pełnotekstowe w trybie logicznym
Tryb logiczny jest prawdopodobnie jedną z najciekawszych funkcji, jakie ma do zaoferowania wyszukiwanie pełnotekstowe MySQL. Ten tryb ma wiele unikalnych zastrzeżeń, ponieważ pozwala rozszerzyć możliwości wyszukiwania za pomocą operatorów logicznych. Gdy używany jest tryb logiczny, niektóre znaki mogą mieć specjalne znaczenie na początku lub na końcu słów. Na przykład:
- "+" oznacza AND;
- "-" oznacza NIE;
- Operatory „(„ i „)” umożliwiają tworzenie podwyrażeń; Operatory
- „<” i „>” zmieniają pozycję wartości wyszukiwania na niższą lub wyższą;
- „~” obniża udział wartości w wynikach wyszukiwania;
- Podwójne cudzysłowy („”) pasują tylko do wartości dosłownych;
- "*" to operator wieloznaczny (patrz wyjaśnienie powyżej).
Te operatory pozwalają rozszerzyć funkcjonalność wyszukiwania:na przykład, jeśli chcesz pobrać wszystkie wiersze zawierające słowo „Demo”, ale nie „Demo2”, możesz użyć zapytania tak:
SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);
Możesz także używać podwójnych cudzysłowów razem z pojedynczymi cudzysłowami, jak na przykład:
SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);
Gotowe wyszukiwanie pełnotekstowe
Zanim użyjesz wyszukiwania pełnotekstowego w MySQL, pamiętaj, że wyszukiwanie ma kilka „błędów”:
- Zarówno silniki pamięci masowej InnoDB, jak i MyISAM mają własne listy odrzucanych słów. Listę słów ignorowanych InnoDB można znaleźć tutaj, listę słów ignorowanych MyISAM można znaleźć tutaj.
- Aby zdefiniować własną listę odrzucanych słów dla InnoDB, zdefiniuj tabelę o takiej samej strukturze jak tabela INNODB_FT_DEFAULT_STOPWORD, wstaw tam odrzucane słowa, a następnie ustaw wartość opcji innodb_ft_server_stopword_table w postaci db_name/table_name.
- Aby zdefiniować własną listę odrzucanych słów dla MyISAM, ustaw zmienną ft_stopword_file na nazwę ścieżki pliku zawierającego listę odrzucanych słów. W pliku słowa stop mogą być oddzielone dowolnymi znakami niealfanumerycznymi z wyjątkiem „_” i „„”. Domyślny plik odrzucania znajduje się w storage/myisam/ft_static.c. Odrzucane słowa można wyłączyć, ustawiając zmienną na pusty ciąg.
- Wyszukiwanie pełnotekstowe nie jest obsługiwane w tabelach podzielonych na partycje.
- Wszystkie kolumny w indeksie FULLTEXT muszą używać tego samego zestawu znaków i sortowania.
- Operacje wyszukiwania pełnotekstowego nie traktują ciągu % jako symbolu wieloznacznego.
Oto kolejny haczyk:warto również pamiętać, że wbudowany parser FULLTEXT określa, gdzie słowa zaczynają się i kończą, patrząc na określone znaki, w tym spację („”), przecinek („, ”) i kropkę („.”), co oznacza, że jeśli wyszukiwany ciąg zawiera co najmniej jeden z tych znaków, wyniki wyszukiwania mogą być niedokładne. Na przykład, jeśli Twoja baza danych zawiera 5 wierszy z ciągiem „test.demo”, zapytanie „test.demo” może zwrócić więcej (10, 15 itp.) wyników, w tym „demo”, „string.demo_example” itp., ponieważ będzie szukać „demo” zamiast „test.demo”, więc możesz utknąć z wieloma nieistotnymi dopasowaniami. MySQL oferuje obejście tego problemu, jeśli chcesz napisać własną wtyczkę w C lub C++ (zobacz dokumentację MySQL), ale do tego czasu niewiele możesz zrobić.
Pełną listę ograniczeń pełnego tekstu MySQL można zobaczyć na stronie dokumentacji MySQL.
Podsumowanie
Funkcja wyszukiwania pełnotekstowego MySQL zapewnia prosty sposób implementacji różnych technik wyszukiwania (wyszukiwania w języku naturalnym, wyszukiwania z rozszerzeniem zapytań i wyszukiwania logicznego) w aplikacji korzystającej z MySQL. Każda z tych technik wyszukiwania ma swoje własne zastrzeżenia i każda z nich może być dostosowana do różnych celów - podejmując decyzję o użyciu wyszukiwania pełnotekstowego, pamiętaj, że ten rodzaj wyszukiwania ma wiele unikalnych dla siebie subtelności, poznaj zarówno korzyści, jak i wady korzystania z wyszukiwania pełnotekstowego w MySQL i mądrze wybieraj.