Watpliwosci co do systemu wyszukiwania nie opuszczaja mnie od kiedy zaczalem prace nad nowa wersja Coyote :P Wlasciwie juz jakis czas temu napisalem modul umozliwiajacy korzystanie z mechanizmu silnika Solr. Dziala b. dobrze, lecz nadal mam watpliwosci co do metody "zbierania" danych, czyli indeksowania tresci serwisu :/ Napisze tutaj moze watpliwosci - moze ktos podsunie jakas mysl, ktora moze okazac sie jakas wskazowka.
A wiec: kazda podstrona w nowym serwisie jest strona, czyli de facto - istnieje odpowiedni rekord w tabeli o nazwie page. Dzieki temu istnieje cale drzewo stron, ktorym latwo mozemy zarzadzac. Czyli tak:
- Csharp
- Wprowadzenie
- Artykuly
...
- Forum
- Newbie
-Nowy temat w Newbie
Kazda strona posiada unikalne ID oraz sciezke dostepu. Czyli np. Csharp/Wprowadzenie/Rozdzial_1. Dzieki temu w latwy sposob mozna wyswietlic drzewo stron albo liste stron w pliku sitemap.xml. Do kazdej strony mozna rowniez ustalic uprawnienia dostepu czy inne opcje. Tabela page posiada rowniez pole page_module okreslajace ID modulu, do ktorego przypisana jest dana strona. Dzieki temu wiadomo, ze np. po wywolaniu URL-a: Forum/Newbie "wlaczony" ma zostac kontroler odpowiadajacy za wyswietlenie listy watkow w tej kategorii.
Teraz: jakie sa mozliwe sposoby indeksacji stron w serwisie?
Sposob nr 1). Napisalem to jakis czas temu. Instalujac modul wyszukiwania Solr, ow modul podczepia sie pod odpowiedni trigger (hook): application.onPageSubmit. Ktory to jest wywolywany w momencie, gdy strona jest zapisywana. Dzieki temu mamy URL strony, ktora potrzeba zindeksowac. Dodajemy URL do kolejki i uruchamiamy crawlera. Takie rozwiazanie napisalem i dziala. Lecz crawler jest prosta klasa w PHP, a jak wiadomo, PHP sie do tego nie nadaje. W zwiazku z tym myslalem o crawlerze napisanym w innym jezyku, jak np. Nutch, ktory jest napisany w Javie i podobno dobrze integruje sie z Solr (nie wiem, nie sprawdzalem).
Dzieki temu mielibysmy porzadnie zindeksowana strone i wyszukiwarke z prawdziwego zdarzenia. Minusem takiego rozwiazania moga byc duplikaty. Np. te same strony zindeksowane wiele razy (np. lista tematow posortowana inaczej). W moim crawlerze PHP utworzylem filtry i wyjatki. Dzieki temu pewne adresy URL moga byc omijane. Mam nadzieje, ze w crawlerze typu Nutch, tez jest taka opcja?
Sposob nr 2). Indeksacja tylko tresci, ktore maja wieksze znaczenie. W sposobie nr 1. crawler indeksuje cale strony. Ten sposob to indeksacja tylko tresci artykulow, czy tresci postow.
Przy wywolaniu triggera, zapisywany jest ID strony. Nastepnie na podstawie ID odczytywany jest modul oraz tzw. lacznik, czyli nazwa klasy ktora odpowiada za konfiguracje strony (niewazne na tym etapie ;)). Kazdy lacznik moze posiadac metody, ktore beda swego rodzaju wrapperem. Ow wrapper bedzie zwracal dane do indeksacji (np. w formie XML). I tak:
jezeli mamy do czynienia z modulem artykulow, tutaj sprawa jest prosta. Wrapper zwraca tresc artykulu, modul "solr" indeksuje ta tresc wraz z URL. Jezeli mamy do czynienia z tematem na forum, wrapper zwraca liste postow do indeksacji. Wada: do stron moga byc przylaczone wtyczki. Np. wtyczka komentarzy. Wowczas ciezko przy takim rozwiazaniu, indeksowac rowniez tresc komentarzy :/
Jak Wy byscie to zrobili?
