Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwarka dla bazy InnoDB
Forum PHP.pl > Forum > PHP
gothye
Witam
Z potrzeby zastosowania kluczy obcych w bazie zaprojektowałem część tabel z Innodb , ale w jednej (gdzie mam umieszczone forum ,kategorie oraz posty użytkowników ) potrzebuję zbudować wyszukiwarke i nie moge zastosować klucza FULLTEXT .
Więc idąc dalej szukając rozwiązania zbudowałem silnik mniej więcej taki jaki ma forum phpbb3 gdzie tekst jest rozbijany na słowa a potem w dodatkowej tabeli SQL powiązane są słowa z id rekordu który go zawiera ,pojawiło się alę .... jeśli tekst zawiera dużą ilość słów (500>) cała akcja trwa 3-4 sekundy a na taką ilość czasu po przeładowaniu strony nie moge pozwolić sobie w projekcie .
Całość pisze w kohana 3.Sprowadzając do najprostrzej postaci model aby przyspieszyć dodawanie do bazy lecz i tak dalej wynik jest mizerny .

więc poszukuje rozwiązania aby zbudować wyszukiwarke , może ma ktoś pomysł ?
sunpietro
tam gdzie potrzebujesz wyszukiwać korzystaj z myisam
gothye
nie mogę ponieważ potrzebyuje korzystać z kluczy obcych w tabelach
phpion
Trzeba było wybrać PostgreSQL, a nie MySQL - nie miałbyś takich dylematów. ~sunpietro dobrze prawi: utwórz sobie 1 tabelę MyISAM, w której będziesz przechowywał indeks pełnotekstowy oraz odwołanie do rekordu źródłowego. Automatyczne usuwanie rekordów z tej tabeli musisz zrobić samodzielnie np. triggerami.
yevaud
zgadzam sie z przedmowcami. Opcjonalnie mozesz rozwazyc procedure skladaowana odpalana co jakis czas w cronie ktora odswiezy tabele fulltextowa

mozesz tez rozwazyc zastosowanie Lucene albo podobnego silnika
JoShiMa
Cytat(gothye @ 16.04.2011, 07:45:48 ) *
więc poszukuje rozwiązania aby zbudować wyszukiwarke , może ma ktoś pomysł ?

A słyszałeś o sphinksie?
IceManSpy
Chcę odnowić temat, bo też szukam sposobu na wyszukiwarkę.

Aplikację piszę w Zendzie, baza jest na silniku InnoDB (potrzebuję kluczy obcych). Nie chciałbym robić dodatkowych tabel na przechowywanie danych do wyszukiwania, bo potem jak do nich zamontować klucze (chyba, że ona jest nie oficjalnie połączona)? Niech to będzie ostateczność.

Zastanawiam się po prostu nad użyciem hardcore'owego like... Ale to tak mało PRO smile.gif
melkorm
MySql od najnowszej wersji (5.6) wspiera FULL TEXT SEARCH na silniku InnoDb
IceManSpy
A w xampp'ie da się zrobić jakoś update?
I używa się jej tak samo jak na MyISAM?

Tylko, że ta wersja MySQL jest teraz w fazie beta :/
melkorm
Więc innego wyboru jak robienie tabelki MyIsam odpowiedzialnej za search nie masz - przy dobrych triggerach da się to ładnie zrobić by w kodzie nie robić śmietniku smile.gif
IceManSpy
A trigger się wywoła automatycznie na jakiś zdarzenie (insert,update,delete)? Czy muszę go wywoływać w programie? I triggera mam wywołać na tabeli na której chcę, aby działał?
melkorm
Cytat
A trigger się wywoła automatycznie na jakiś zdarzenie (insert,update,delete)?


Tak, i wtedy piszesz triggery dla tabelki InnoDb która automatycznie update'uje tabelkę MyIsam.
IceManSpy
Ok, wielkie dzięki za podpowiedzi smile.gif Kliknąłbym "Pomógł" ale nie jestem właścicielem tematu wink.gif Zrobię sobie 3 triggery - 1 na insert, 2 na update i 3 na delete. Choć chyba na update nie będzie potrzebny, bo ta tabela nie będzie update'owana smile.gif

Taki mały offtop, czy lepiej zrobić to na triggerach czy zrobić taki insert w aplikacji? Piszę w Zendzie, więc można by było stworzyc jakąś metodę do tego celu i ją wywoływać. Dzięki temu w razie zmiany źródła danych to nie powinno się wysypać. Małe są szanse na zmianę źródła, ale chciałbym poznać opinię na ten pomysł.
melkorm
Cytat
Taki mały offtop, czy lepiej zrobić to na triggerach czy zrobić taki insert w aplikacji? Piszę w Zendzie, więc można by było stworzyc jakąś metodę do tego celu i ją wywoływać. Dzięki temu w razie zmiany źródła danych to nie powinno się wysypać. Małe są szanse na zmianę źródła, ale chciałbym poznać opinię na ten pomysł.


To też zależy czy na serwerze będziesz miał prawa do założenia triggera na bazie, zazwyczaj nie ma się do nich dostępu.

Ogólnie jeżeli używasz Zend'a to dobrze się składa, ponieważ możesz nadpisać klasę ActiveRecordu i tam nadpisać metody save / delete:
  1. class Foo extends Zend_Db_Table_Row
  2. {
  3. public function save()
  4. {
  5. // operacje dla dodawania / edycji
  6. // dodawanie jest wtedy keidy $this->_cleanData jest puste
  7. parent ::save();
  8. }
  9. public function delete()
  10. {
  11. // operacje dla usuwania
  12. parent ::delete();
  13. }
  14. }
  15. // później w modelu
  16. private $_rowClass = 'Foo';
  17.  
  18. // i możesz normalnei robić
  19. $r = $model->createRow();
  20. $r->bar = 'newbar';
  21. $r->Save();
  22.  



Mam nadzieję że wyjaśniłem smile.gif

PS. Musisz także pamiętać o tym że przy tej metodzie nie zadizałają funkcje typu:
  1. $model->delete(warunki);
  2. $model->update(warunki);
IceManSpy
Albo stworzyć nowy model dla tej tabeli do wyszukiwania i potem tworzyć obiekty w "głównym" modelu i tylko wywoływać odpowiednie metody.

Chyba, że modele między sobą nie mogą się bezpośrednio (w jednym modelu tworzone są obiekty innych) kontaktować? tylko za pomocą kontrolera.
melkorm
Ja mówię o samej aktualizacji, system samego szukania implementuj sobie normalnie wink.gif
IceManSpy
Właśnie nie za bardzo to rozumiem :/

Myślałem o czymś takim (taki ogólny skrót):
  1. <?php
  2. class UserSearcher extends Zend_Db_Table_Abstract
  3. {
  4. public function dodaj($jakiesdane) {
  5. $data = array$jakiesdane
  6. $this->insert($data);
  7. }
  8. }
  9.  
  10. class User extends Zend_Db_Table_Abstract
  11. {
  12. public function dodaj($dane) {
  13. $data = array($dane);
  14. $this->insert($data);
  15.  
  16. $szukajka = new UserSearcher();
  17. $szukajka->dodaj($dane);
  18. }
  19. }
  20. ?>

Dzięki temu w UserSearcher mógłbym napisać sobie system szukania jako metodę.
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.