Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: FULLTEXT search a indeksy
Forum PHP.pl > Forum > Bazy danych > MySQL
Walian
Zamierzam teraz zrobić wyszukiwarkę do artykułów.
Chciałbym zrobić ją dość rozbudowaną - możliwość wyszukiwania wg. nazwy, opisu, treści, daty dodania z pewnego przedziału, daty ostatniej modyfikacji z pewnego przedziału, nicku dodającego itp.

No więc zacząłem szukać informacji o tym, jak utworzyć indeksy dla takiego wyszukiwania i natrafiłem na to:
http://www.kacka.pl/index.php?showtopic=132
Sporo tych indeksów dodał...
Weźmy pod uwagę, że nie zawsze użytkownik wypełni wszystkie pola wyszukiwarki bo np. chce wyszukać tylko w nazwie, a innym razem w treści, a jeszcze innym razem w nazwie i treści.
Czy do stworzenia takiej wyszukiwarki konieczne będzie dodanie aż tylu indeksów?

Tabela:
  1. CREATE TABLE `articles` (
  2. `article_id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `article_category_id` tinyint(3) UNSIGNED NOT NULL DEFAULT 0, -- *
  4. `article_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
  5. `article_views` int(11) UNSIGNED NOT NULL DEFAULT 0, -- *
  6. `article_date_added` datetime NOT NULL, -- *
  7. `article_date_modified` datetime NOT NULL, -- *
  8. `article_desc` tinytext COLLATE utf8_polish_ci NOT NULL, -- *
  9. `article_content` mediumtext COLLATE utf8_polish_ci NOT NULL, -- *
  10. `article_adder` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '', -- *
  11. `article_last_changer` varchar(12) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  12. `article_name` varchar(64) COLLATE utf8_polish_ci NOT NULL DEFAULT '', -- *
  13. `article_safe_name` varchar(64) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  14. PRIMARY KEY (`article_id`),
  15. UNIQUE KEY `article_name` (`article_name`),
  16. UNIQUE KEY `article_safe_name` (`article_safe_name`),
  17. KEY `article_category_id` (`article_category_id`)
  18. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


Pola oznaczone "-- *" to pola wg. których chcę umożliwić wyszukiwanie.
Dodatkowo wyszukiwarka będzie ograniczać wyniki wyszukiwania do artykułów o pewnym statusie.
Mchl
Jeżeli chcesz w danej kolumnie robić wyszukiwanie pełnotekstowe, to musisz mieć na niej index FULLTEXT. Po prostu.

Osobną sprawą jest, czy warto to robić dla kolumny VARCHAR(64)

W takim wypadku lepeij będzie się raczej sprawdzało LIKE
Walian
Cytat("Mchl")
Jeżeli chcesz w danej kolumnie robić wyszukiwanie pełnotekstowe, to musisz mieć na niej index FULLTEXT. Po prostu.

Tak tak, wiem o tym.

Ale wciąż nie wiem jak zrobić te indeksy - czy wystarczy po jednym na pole czy porobić też dodatkowo indeksy łączone tzn. jeden na kilka pól? A może tylko te ostatnie? Te ostatnie się chyba nazywają "kompozytowe".

I co do LIKE - kiedyś wyczytałem, że lepiej jest robić to na REGEXP - co jest prawdą?
Które będzie szybsze?
Mchl
Oczywiście możesz zrobić indeks na kilku kolumnach, tylko że wtedy musisz zawsze szukać AGAINST wszystkich kolumn w tym indeksie. Tak więc jeżeli ważne jest dla Ciebie żeby użytkownik mógł szukać po konkretnej kolumnie, to musisz mieć dla tej kolumny osobny indeks.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.