Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwarka dla bazy InnoDB
gothye
post
Post #1





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


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ł ?
Go to the top of the page
+Quote Post
sunpietro
post
Post #2





Grupa: Zarejestrowani
Postów: 262
Pomógł: 26
Dołączył: 23.01.2009
Skąd: eZ Systems

Ostrzeżenie: (0%)
-----


tam gdzie potrzebujesz wyszukiwać korzystaj z myisam
Go to the top of the page
+Quote Post
gothye
post
Post #3





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


nie mogę ponieważ potrzebyuje korzystać z kluczy obcych w tabelach
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
yevaud
post
Post #5





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
JoShiMa
post
Post #6





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
IceManSpy
post
Post #7





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
melkorm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


MySql od najnowszej wersji (5.6) wspiera FULL TEXT SEARCH na silniku InnoDb
Go to the top of the page
+Quote Post
IceManSpy
post
Post #9





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 :/

Ten post edytował IceManSpy 7.08.2011, 23:43:43
Go to the top of the page
+Quote Post
melkorm
post
Post #10





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
IceManSpy
post
Post #11





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ł?

Ten post edytował IceManSpy 8.08.2011, 00:12:25
Go to the top of the page
+Quote Post
melkorm
post
Post #12





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
IceManSpy
post
Post #13





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ok, wielkie dzięki za podpowiedzi (IMG:style_emoticons/default/smile.gif) Kliknąłbym "Pomógł" ale nie jestem właścicielem tematu (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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ł.

Ten post edytował IceManSpy 8.08.2011, 00:38:52
Go to the top of the page
+Quote Post
melkorm
post
Post #14





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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);


Ten post edytował melkorm 8.08.2011, 05:31:23
Go to the top of the page
+Quote Post
IceManSpy
post
Post #15





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował IceManSpy 8.08.2011, 09:48:52
Go to the top of the page
+Quote Post
melkorm
post
Post #16





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Ja mówię o samej aktualizacji, system samego szukania implementuj sobie normalnie (IMG:style_emoticons/default/wink.gif)

Ten post edytował melkorm 8.08.2011, 12:01:15
Go to the top of the page
+Quote Post
IceManSpy
post
Post #17





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował IceManSpy 8.08.2011, 13:32:59
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 19:52