ugrás a tartalomhoz

Keresőmotor fejlesztése saját kezüleg PHP-ben

Dzsijszi · 2009. Ápr. 27. (H), 22.31
Sziasztok!

Arra lennék kíváncsi, hogy PHP-val lehet készíteni keresőt? Ha nem akkor milyen programnyelv kell egy keresőmotor írásához?

Előre is köszönöm a segítséget!

Dzsijszi
 
1

kezdd az alapoknál

gex · 2009. Ápr. 27. (H), 23.30
szerintem ha ez a kérdés így felmerült benned akkor inkább valami kisebb feladattal kezdj... :)
2

Milyen feledattal?

Dzsijszi · 2009. Ápr. 28. (K), 07.29
Mire gondolsz?
3

Php

janoszen · 2009. Ápr. 28. (K), 07.45
Arra, hogy ismerkedj meg azzal, hogy mi is valójában a PHP. ha ezzel tisztában vagy, akkor rájösz, hogy lehet, de nem lesz hatékony.

Ezen felül a kérdés nem volt pontos. Google konkurenst szeretnél, vagy egy oldalon való keresést, netán egy termékkeresőt?
4

...

Dzsijszi · 2009. Ápr. 28. (K), 07.53
Egy olyan keresőre gondoltam, mint a google. Tudom, hogy több hónapos munka, de akkor is szeretném legalább megtanulni, hogy hogyan kell egy ilyet készíteni.
5

Gratula

janoszen · 2009. Ápr. 28. (K), 07.59
Erre több válasz is eszembe jut, az első a "hülye vagy, fiam". Ez fulltime munkaidőben több emberév. Ha ilyenbe bele akarsz kezdeni, akkor vastag algoritmuselmélet, gráfelmélet, matematikai alapok plusz brutál jó C tudás. Ha megcsinálod, riszpekt, van egy állásajánlatom plusz valszeg vevőm is a dologra.
6

akkor egyszerűsítsünk

Dzsijszi · 2009. Ápr. 28. (K), 08.03
Jó akkor nézzük meg azt, hogy hogyan kell olyan keresőt készíteni, ami a megadott oldalakon keres. Tehát, ha mondjuk 1 oldalt írok be neki, akkor 1 oldalon keres. Ha 160 URL-írok be neki akkor azon 160 URL-en keres majd. Tudom, hogy ilyenje is van a google-nek és azzal 2 perc ilyet ingyen csinálni, de szeretnék egy sajátot készíteni. Tudnátok ehhez tanácsot adni vagy segíteni?
7

Index

janoszen · 2009. Ápr. 28. (K), 08.10
Namost ebben két lehetőség van. Az egyik, hogy tied az oldal, te írod a rendszert. Ez esetben minden tartalmat SQLben tárolsz és abban is keresel. Ha nem a tied, akkor írsz egy robotot, ami a linkeket követve lementi az oldalt SQLbe és abban keres. Ezzel az a baj, hogy nem skálázható, azaz néhány tíz/százezer lap (html file) után már nem létezik akkora vas, hogy emberi sebességgel menjen a keresés.
8

OMG!

deejayy · 2009. Ápr. 28. (K), 08.13
Én maradok a "hülye vagy, fiam" megoldásnál.

:D
15

Ez jó!

s_volenszki · 2009. Ápr. 29. (Sze), 12.15
<off>
OMG

Ezt még nem láttam soha...nagyon jó! :)
</off>
9

Értem, utána mi a 2. lépés?

Dzsijszi · 2009. Ápr. 28. (K), 08.14
Hogyan kell robotot készíteni?
10

Első nekifutásra ajánlom a Sphinx

winston · 2009. Ápr. 28. (K), 09.34
Első nekifutásra ajánlom a Sphinx keresőmotort. Igazából ez egy adott sitehoz van tervezve, bár kis trükközgetéssel (robot) biztos megoldható, hogy több oldalt felindexeljen.

Ami a robotot illeti: robotot úgy kell írni, mint bármi más programot :) Ha már tudod mi a cél, megtervezed, implementálod.

Szerintem itt az a hiba, hogy még nem tudod, mit akarsz. Ne akarj túl nagyot: először próbálj meg valami kisebbet. Pl. egy fórum keresőt, ami majd a hozzászólás bejegyzéseit nézi sql-ből. Már egy egész site keresője is igen komoly kihívás tud lenni, tapasztaltabbaknak is, nemhogy egy keresőoldal. Csak lépésről lépésre ;)

Megj: csak hogy ne mondd, hogy semmi hasznosat nem írtam: a robot ami neked kell annyit csinál, hogy lekér egy oldalt, a szövegből kiszedi a sallangot (html, stb.), eltárolja, keresésre előfeldolgozza a maradék szöveget), regexpel kikeresi az url-eket, és azokra is meghívja az egész processzt. Ez mind megoldható php-ben, bár akadhatnak problémáid (milyen mélységig indexelsz, stb.)

b.
11

Köszönöm

Dzsijszi · 2009. Ápr. 28. (K), 13.44
Jó, köszönöm a segítséget! Te legalább hasznosat írtál!
12

Javaslat

yaanno · 2009. Ápr. 28. (K), 22.47
Szerintem (is) kezdd azzal, hogy nézz bele már meglévő keresők forrásába. Ha Java is jöhet, akkor nézd meg a YaCy projektet, ami egy p2p engine; ha nem is kell belőle minden, az indexelő/crawler jól jöhet.

Valószínűnek tartom, hogy ilyesmit C/C++ nyelven szoktak írni. A crawler meg akármi nyelven írható (Perl pl. hatékony lehet), néha még JavaScriptben is :)
19

Csak nem?

Adam · 2009. Ápr. 30. (Cs), 09.59
Annó Liligonál voltam is interjún, hogy ilyet kell írni majd, csak aztán lett belőle más munkahely. ;)
25

De bizony

yaanno · 2009. Május. 4. (H), 20.40
Azt nem állítom, hogy JavaScriptben robotot írni kényelmes, mindenesetre az akkori eszközökkel mérve gondolom az tűnt a legalkalmasabbnak :) 1-2 éve még mindig a Rhino számított a leggyorsabb szkript/jvm körnezetnek, ma ez nem tudom, hogy áll.

Érdekes lenne megnézni, mondjuk egy Scala/JRuby/Jython/Rhino/Clojure összevetést - valószínűleg a Ruby és a Python hamar elvérezne :) Olyanról mindenesetre hallottam már, hogy a számításigényes részt áttették Javaból Scala/Clojure implementációra.
13

???

Hodicska Gergely · 2009. Ápr. 28. (K), 23.10
Nézted már te a Sphinxet? A Sphinx alapvetően nem egy site-ot indexel, hanem SQL-ből dolgozik. Persze megoldható vele, hogy leindexelj egy site-ot is, de akkor meg kell írnod a ful robotot.

Kérdezőnek: ebben a kategóriában érdekes lehet még a Lucene (PHP esetén akár plusz Solr), Xapian, de ami számodra érdekesebb lehet, az a Mnogosearch, ezzel tudsz meglévő site-ot végigindexeltetni.
14

pongyola

winston · 2009. Ápr. 28. (K), 23.20
bocsi, némiképp pongyolán fogalmaztam. valóban nem indexel mint a google, vagy hasonló, nyilván bele kell tenni valahogy az adatot. teljesen jogos a helyreigazítás, hibásan fogalmaztam.
16

Elmélet

s_volenszki · 2009. Ápr. 29. (Sze), 12.44
Gondold át, milyen feladatkörökkel kell foglalkoznia egy ilyesmi alkalmazásnak:

Az első és legfontosabb egység az adatok (url-ek) feldolgozása, a másik a keresések kiszolgálása.

Az adatfeldolgozásnál (url-ek) figyelned kell:
- a meglévő (már indexelt) tartalom változására
- az új tartalmak indexelésére
- már nemlétező tartalmak karbantartására

Ha már foglalkoztál vagy tanultál programozást, próbálj létrehozni elméleti egységeket és abból építs egy elméleti alkalmazást:

1. Tételezzük fel, hogy az url-eken található összes tartalmat szöveges változóknak tekintjük (azok tényleges beolvasása technikai részletkérdés, biztos, hogy találsz a php manual-ban példákat). Ha ezt elfogaodo, akkor
2. ezeket a szöveges változókat url-hez azonosíthatóan el kell menteni adatbázisba, majd
3. az elmentett tartalomra építeni kell egy szótár adatbázis. Fel kell építened egy olyan "tartalom<=>kapcsoló<=>szótár" struktúrát, amiből majd ki tudod szolgálni a kereséseket. Kicsit részletesebben, a kapcsoló táblába gyűjtögeted a tartalom<=>szó összefüggéseket, így egy szó keresése a szótárban megadja majd az összes url-t, ahol az a szó megtalálható (ez nagyon felületes, csak elméleti).

Ezek után már csak a naprakészen tartás a fontos, illetve az adott url-ekhez (persze ha domain-eket indexelsz, nem csak egy-egy adott oldalt) megjelenő új tartalmak indexelése, régiek kiürítése.

Így hát a programod azon része, amelyik meghatározott időközönként (cron-olva) begyűjti a megadott url-ek tartalmát, az lesz a robotod.

A keresés kiszolgálása sem sokkal egyszerűbb (talán programozástechnikailag igen), a keresési gyakoriság függvényében sokat bonyolódhat, amúgy meg egy átlagos bonyolultságú lekérdezés:

1. Kikeresed a szótárból a szót, amit keresnek,
2. Lekéred a kapcsoló táblából az összes tartalom azonosítót, amiben szerepel a keresőszó,
3. csinálsz az url-ekből egy találati listát.

Ha tovább bonyolítanánk:

- A keresőszavak nem minden esetben ragozatlan tőszavak, ezért a hasonlóságra is kell figyelmet szentelni (körte=>körte%)
- Keresőszó szinonimák, keresőszó egyéb összetett szavakban (körte=>körtefa | fa)
- Ha keresés után megszámolod, hogy a kapcsoló tábládban megtalált egyezések számszerűen hogyan oszlanak meg a találati lista tekintetében, mindjárt tudsz csinálni egy találati "értékességi" sorrendet (persze célszerű vizsgálni a teljes tartalomban előforduló szavak arányát is)

Hát nagyjából ennyi, és azt hiszen még lenne sok jó ötletem, de ezen már el lehet indulni!
17

Köszi

Dzsijszi · 2009. Ápr. 29. (Sze), 16.02
Jó, köszönöm a segítséget! Ez nagyon jó! Ha van még ötleted akkor azt szívesen fogadnám privátban.
18

HTTP

Joó Ádám · 2009. Ápr. 29. (Sze), 21.18
Ami eddig nem volt kihangsúlyozva: gyakorlatilag meg kell írnod egy HTTP klienst.
20

Már megírták

vbence · 2009. Ápr. 30. (Cs), 11.07
A PHP-ben van HTTP kliens funkcionalitás, ha a fopen wrappers engedélyezve van egyszerűen megnyithatsz egy távoli fájlt olvasásra. Ezenkívül vannak még a CURL függvények, amivel tuningol kérések is gond nékül kezdeményezhetők.
21

Persze

Joó Ádám · 2009. Május. 1. (P), 19.21
Nyilván, de közben azért már elhangzott, hogy egy Google típusú kereső írásához nem a PHP a legcélszerűbb választás, illetve gyakorlatilag mindenre lehet találni kész megoldást, de én úgy vettem le, hogy a kérdező maga szeretne alkotni. De igen, ha PHP, akkor a fenti lehetőségek rendelkezésre állnak.
22

CURL

janoszen · 2009. Május. 1. (P), 20.57
A CURL pl nem csak PHP-hoz van. cURL/libcurl
23

bonyolultabb

akos.tajti · 2009. Május. 3. (V), 00.47
a ragozott szavak problémáját lehet kezelni egy olyan függvénnyel, ami minden szóból valamilyen kódot készít, ami csak olyan szavakra egyezik meg, amiknek azonos a szótövük. hasonló függvény a soundex, viszont az a kiejtéssel csinálja meg ugyanezt (a hasonló kiejtésű szavak kódja megegyezik).
egyébként szerintem a web bejárása itt a legkisebb probléma. a megfelelő reprezentációt, amiben aza datokat tárolod, nehezebb megválasztani, valószínűleg nem egy egyszerű táblaszerkezet lesz.
ezen kívül ha valami komolyabb keresőt akarsz, akkor érdemes figyelembe venned (mint a google) a bejövő és a kimenő linkek számát és ez alapján döntenes. ha még jobbat akarsz, akkor peddig figyelheted a kattintások számát. abból tudod, hogy a felhasználónak mi tetszett a találatok közül. ha ezt valamilyen tanuló algoritmussal (pl neurális hálós dolgok) be tudod építeni a későbbi eredményekbe, azzal nem csak optimalizálni tudsz, hanem jobb is lesz a szolgáltatásod.
24

mivel még nem említette senki

lionel87 · 2009. Május. 4. (H), 03.11
szerencsétlenségemre már többfajta keresőt is kellett csinálnom, én mindig a mysql fulltext keresési képességeit használtam ki, egy kis ügyességgel szépen lehet súlyozott keresési eredményeket csinálni.

hogy írjak valami példát is, ez a cikk elég jó lehet kiindulásnak: http://deadlime.hu/2006/10/20/mysql-fulltext-kereses/

ez így elég egyszerű szerintem, emellé már csak a crawler kell de az se valami hűdenagy dolog, max 200 sorból kijön az is phpban.

ez a megoldás lehet hogy nem lesz olyan gyors mint egy C ben írt kereső, viszont legalább hamar megvan és nem kell semmit se túlbonyolítani rajta.
26

Köszönöm és még 1 kérdés

Dzsijszi · 2009. Május. 10. (V), 07.45
Mindenkinek köszönöm, akik segítettek! Az lenne még a kérdésem, hogy a kereső sima tárhelyre mehet vagy valami különleges spéci tárhelyre lenne szükség? Valamint kb. mekkora tárhelyre és MySQL -re lesz szükség?
27

Mennyi adat

Poetro · 2009. Május. 10. (V), 09.50
Én személyesen még nem láttam "sima tárhely"-et, ahogyan "egyszerű weboldal"-t sem, pedig "mindenki" olyat akar. A lényeg, hogy azok a szolgáltatások, amikre szükséged lesz, azok legyenek meg, vagy nagyon olcsón elérhetővé válhassanak.
Hogy mekkora tárhelyre és MySQL-re lesz szükséges? Az attól függ milyen módszert választasz az indexelésre, keresésre, és mennyi adatot szeretnél kereshetővé tenni. De ha kb. a kereshető adat 4-8 szoros mennyiséggel számolsz, mint tárolandó mennyiség, akkor nagyot nem tévedhetsz.
28

"Tárhely"

vbence · 2009. Május. 10. (V), 10.17
A kereső, mint bizonyára kiderült egy komplex elosztott alkalmazás. Ne tárhelyben gondolkodj, hanem valamilyen tetszőlegesen bővíthető alkalmazásszerver-megoldásban. Egy egyszerű példa: a spider (vagy crawler) része a keresődnek nem request-response alapú lesz, tehát az apache-on elül futó PHP nem megoldás erre a problémára. Egy olyan környezetre van szükséged, ahol esetleg más nyelveket is kipróbálhatsz (mert a PHP lehetőségei hamar kimerülnek majd).

Egyes szolgáltatók ajánlanak virtuális szerver megoldásokat, ahol kapsz egy IP címet és mögötte egy látszólagos saját szervert, amire te teleptheted az oprendszertől kezdve minden rétegét az alkalmazásodnak. Érdemes lenne kipróbálni az Amazon ECC szolgáltatását, ahol dinamikusan hozhatsz létre maganak több virtuális szervert is, ahogy a tesztelés, vagy a forgalom növekedése megkívánja.

Ha meg csak játékból csinálod, állítsd be a sarokba egy régi gépedet linuxszal vagy freebsdvel, ahol mindent kipróbálhatsz garantáltan kevesebb hajtépéssel, mint ha egy rendszergazdával kéne veszekedned, hogy kapcsolja már be az Apache XY beálltását...
29

ezt, hogy érted?

Dzsijszi · 2009. Május. 10. (V), 12.40
Ezt, hogy érted, hogy "állítsd be a sarokba egy régi gépedet linuxszal vagy freebsdvel, ahol mindent kipróbálhatsz garantáltan kevesebb hajtépéssel, mint ha egy rendszergazdával kéne veszekedned, hogy kapcsolja már be az Apache XY beálltását..."???

Mit érek vele, ha beállítok egy gépet a sarokba? Mármint azon, hogy állítsak be dolgokat? Ezt nem értem.
31

Környezet

vbence · 2009. Május. 10. (V), 13.12
Úgy érterm, hogy készts egy épkézláb, unix-szerű környezetet magadnak otthon, ahol nem köti meg semmi a kezed. Fejleszteni úgyis otthon fejlesztünk nem egy éles tárhelyen.

Másrészt pedig neked "szerver" kell, nem "tárhely".
32

azt, hogy kell?

Dzsijszi · 2009. Május. 19. (K), 22.19
Azt, hogyan kell? Hogyan tudok "egy" régi számítógépből szervert csinálni?
33

Tanulj

Joó Ádám · 2009. Május. 19. (K), 23.21
Azt hiszem érdemes lenne az alapokkal kezdeni. Onnan, hogyan működik egy számítógép, hogyan épül fel egy hálózat, az internet és a web. Utána állj neki programozást tanulni, valami egyszerű feladaton.

Ebben a szálban már minden elhangzott, amire szükséged lesz, de bővebben senki nem fogja magyarázgatni, magadnak kell utánajárni. A Google a barátod lesz.

Kezdésképp két hasznos iromány:

30

Nyugi én értem

Ustak · 2009. Május. 10. (V), 13.02
bár jómagam 4-5 év javascript, php, sql, linux, pici apache, halovány mod_rewrite tapasztalattal sem mernék most ebbe belevágni, ha nem függene a világ sorsa rajta :-)
Az viszont tény hogy két gépemet is a sarokba állítottam linuxal, és próbálkoztam, mert máshogy nem megy.