Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja wyszukiwarki
Forum PHP.pl > Forum > Bazy danych > MySQL
rav1989
Witam,

Z racji tego, że wykorzystałem InnoDB nie moge skorzystać z FULLTEXT więc musiałem zrobić wyszukiwarke na LIKEach.
Strona jest oparta o framework CodeIgniter i do budowy zapytań skorzystałem z Active Records.

  1. public function search($search_query) {
  2. $search_query = urldecode(trim($search_query));
  3. $this->db->from('product');
  4. $this->db->select('product_name,product_price,product_img');
  5. $strings = explode(' ', $search_query);
  6. foreach ($strings as $match) {
  7. $this->db->or_like('product_name', $match);
  8. $this->db->or_like('product_desc', $match);
  9. }
  10. $products = $this->db->get()->result();
  11. if (empty($products))
  12. return false;
  13.  
  14. return $products;
  15. }
  16.  


Obecnie dopiero piszę i na bieżąco testuje stronę na localhoscie (WampServer Version 2.2, MySQL 5.5.24-log) no i akurat mam taki mały problem z tą wyszukiwarką, że działa ale muli.

Dlatego proszę o jakieś wskazówki jak możnaby to zoptymalizować/przyśpieszyć.

Pozdrawiam
Rav
darko
Jest kilka rozwiązań tego problemu, niektóre nie wykluczają się wzajemnie:
- użycie osobnej tabeli (na silniku myisam) plus fulltext search
- zrezygnowanie z modeli orm na rzecz bezpośrednich zapytań do bazy danych
- użycie zewnętrznego silnika wyszukiwarki, np. Lucene/Solr albo Sphinx
Dla większych projektów polecam to ostatnie rozwiązanie, szczególnie Solr.
rav1989
Hmm... chyba skorzystam z klona na MyISAM i dodam FULLTEXT.
Czyli teraz będę musiał zmodyfikować kod tak, żeby wszystkie akcje które się dzieją na tej oryginalnej (InnoDB) działy się też na klonie MyISAM.
Co prawda teraz zamiast jednego zapytania INSERT, UPDATE, DELETE będą dwa bo jeszcze trzeba klona obsłużyć. Trzeba będzie to jeszcze jakoś zsynchronizować, żeby indeksy się zgadzały.
Mam nadzieję, że to załatwi sprawę.
d3ut3r
Myślę, że zamiast klonowania zapytań spokojnie można sobie poradzić mechanizmem triggerów w mysql.

Jednak tak jak Darko napisał, jeżeli projekt jest większy i masz taką możliwość to skorzystaj z zewnętrznych mechanizmów indeksowania i wyszukiwania treści. Solr pod tym względem wydaje się przodować chociaż dopiero 1 raz zapoznałem się z nim całkiem niedawno.
rav1989
Cytat(d3ut3r @ 13.08.2012, 02:52:21 ) *
Myślę, że zamiast klonowania zapytań spokojnie można sobie poradzić mechanizmem triggerów w mysql.

Jednak tak jak Darko napisał, jeżeli projekt jest większy i masz taką możliwość to skorzystaj z zewnętrznych mechanizmów indeksowania i wyszukiwania treści. Solr pod tym względem wydaje się przodować chociaż dopiero 1 raz zapoznałem się z nim całkiem niedawno.


Fakt, zapomniałem o triggerach tongue.gif

Co do Solr to nie wiem czy serwer docelowy będzie go obsługiwał. Narazie wszystko powstaje na localhost i mogę sobie łatwo doistalować to czego mi brakuje. Chodzi o to, że jak napakuje super-hiper rozwiązań to może się okazać, że jedynym wyjściem będzie kupno drogiego dedyka zamiast hostingu. Nie chciałbym dodatkowo narażać kogoś na koszty.

Niemniej jednak przyjrzę się i temu rozwiązaniu bliżej smile.gif

Pozdrawiam
Rav
darko
Solr'a na zwykłym, "gołym" hostingu (bez dostępu do ssha, konfiguracji firewalla i screena) nie odpalisz, ale możesz śmiało testować lokalnie.
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.