Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Tee se itse: hakukone

Sivun loppuun

ajv [15.09.2005 07:26:40]

#

Onkohan kukaan ikinä moista toteuttanut? Paintball-joukkueemme kotisivuilla alkaa sisältöä olla jo sen verran, että jonkunlainen hakukone olisi tarpeen. Lähes kaikki data on kyllä tietokannassa, ja voisin tietysti mennä sieltä, missä aita on matalin ja tehdä haun jokaiseen oleelliseen tietokannan tauluun. Tosin kun pikkasenkaan ajattelee asiaa pidemmälle, tuo ei enää kuulosta kovin järkevältä, sillä tuolla tyylillä joudutaan suorittamaan useita monimutkaisia hakulauseita, sillä kanta on hyvin pitkälle normalisoitu.

Parempi tapa siis olisi (vai olisiko?) listata kaikki sivujen sisältö esim. kerran yössä tietokantaan, jolloin ei tarvitsisi tehdä kuin yksi fulltext-haku ja samalla haulla saataisiin myös suorat osoitteet sivuille. Tätä varten kuitenkin pitäisi tehdä oma hakurobotti. Mitenköhän tälläistä kannattaisi lähteä toteuttamaan? Ei oikein tule muuta mieleen, kuin että se lukee sivun, tallettaa sen tietokantaan, parsii siitä linkit ja indeksoi linkkien takana olevat sivut. Toimii näin kunnes kaikki sivut on indeksoitu. Onko tämä oikea tapa?

Toinen asia: mitä sinne tietokantaan kannataisi loppujen lopuksi tallentaa? Siis kuinka paljon html:ää tulisi suodatella vai tulisiko suodatella kaikki? Kannattaisiko kantaan tehdä oma sarake, jossa olisi listattuna sivun avainsanat (esim. kaikki <hx></h>-tagien välistä löytyvät sanat)?

Toteutuskielestä en vielä tiedä, mutta todennäköisesti PHP. Tai sitten vaikka harjoituksen kannalta PERL. Sillä nyt ei suuremmin vielä ole väliä.

Ajatuksia, ideoita?

Edit: Aloituslause: "Onkohan kukaan ikinä moista toteutttanut?". Lähinnä onko kukaan putkalainen? :)

peran [15.09.2005 16:28:06]

#

Tein kerran yhteen firmaan hakukoneen (Intranet).
Se ei toiminut dynaamisissa sivuissa, mutta pikkaisen muuttamalla sen saisi toimimaan myös dynaamisissa sivuissa.
Se koostui kahdesta osasta: indeksoijasta, ja varsinaisesta hakijasta.

Indeksoija muutti htm-sivut raaka-asciiksi, ja merkkasi ylös linkit sivujen ja <A Name..> tagien mukaisesti.

Käsittääkseni ohjelmani on vieläkin toiminnassa.

Se oli tehty Delphillä. Osasi JA ja TAI haut.

ajv [15.09.2005 21:01:25]

#

peran kirjoitti:

Indeksoija muutti htm-sivut raaka-asciiksi, ja merkkasi ylös linkit sivujen ja <A Name..> tagien mukaisesti.

Eh... Nyt menee heti yli. Raaka-asciiksi? Merkkasi ylös linkit sivujen ja <A Name..> tagien mukaisesti?

Mitähän mahdat linkkien ylösmerkkaamisella tarkoittaa?

Minkälainen oli tietokantasi?

Edit: Äh, irkissä selvisi jo hieman, mutta tuo linkkien ylösmerkkaus vielä vähän hämärän peitossa. Haluaisitko kertoa hieman enemmän systeemistäsi? Tai ihan kuka vaan, jolla on jotain käsitystä asiasta?

Antti Laaksonen [15.09.2005 21:27:40]

#

Jos tietoa ei ole aivan hirveästi, niin pelkkä suoraan tietokannasta etsiminen voisi olla ihan hyvä ratkaisu. Esim. Ohjelmointiputkan haku toimii näin - ja minusta sillä löytää varsin hyvin. Hakuaineistossa olevasta HTML:stä ei kannata pahemmin murehtia, sillä harvapa sellaisilla sanoilla etsii (ainakaan Paintball-sivustolta), jotka löytyvät vahingossa vain HTML-osuudesta.

Jos päädyt jotenkin käsittelemään etukäteen haettavat sivut, ne kannattaa ainakin hakea suoraan tietokannasta rekursiivisen linkkihaun asemesta. Sinähän kuitenkin tiedät kaikki tietokannassa olevat sivut, toisin kuin Google ja muut ulkopuoliset hakukoneet.

ajv [15.09.2005 21:40:27]

#

Antti Laaksonen kirjoitti:

Jos päädyt jotenkin käsittelemään etukäteen haettavat sivut, ne kannattaa ainakin hakea suoraan tietokannasta rekursiivisen linkkihaun asemesta.

Tässä toteutuksessa on se huono puoli, että "hakukoneesta" tulee sivustokohtainen sen sijaan, että tuon linkkien kautta rekursiivisen sivujen indeksoimisen saisi helpolla pystyyn sivuille kuin sivuille.

peran [16.09.2005 00:33:45]

#

ajv kirjoitti:

peran kirjoitti:

Indeksoija muutti htm-sivut raaka-asciiksi, ja merkkasi ylös linkit sivujen ja <A Name..> tagien mukaisesti.

Eh... Nyt menee heti yli. Raaka-asciiksi? Merkkasi ylös linkit sivujen ja <A Name..> tagien mukaisesti?

Mitähän mahdat linkkien ylösmerkkaamisella tarkoittaa?

Minkälainen oli tietokantasi?

Edit: Äh, irkissä selvisi jo hieman, mutta tuo linkkien ylösmerkkaus vielä vähän hämärän peitossa. Haluaisitko kertoa hieman enemmän systeemistäsi? Tai ihan kuka vaan, jolla on jotain käsitystä asiasta?

Taisi tulla hiukan ylimalkaisesti kerrottua.

Pääperiaate:
Rakensin kaksi tiedostoa.
1. Raakatekstitiedoston
2. Indeksitiedoston

Raakatekstitiedostosta etsitään merkkijonoa kaikilla TAI ehdoilla n.s. verkkohaulla.
Kun löydetään jonkin TAI-ehdon toteuttava merkkijonosarja, tutkitaan indeksitiedostosta JA-ehtojen väli.
Kun ollaan löydetty ko. väli, tutkitaan täyttyvätkö kaikki JA-ehdot.

Jos kaikki Ja ehdot täyttyvät, tulostetaaan ko. väli Raakatekstitiedoston sisältämästä osasta pieni pätkä, jossa hakusana(t) löytyy.

Raakateksti sisältää sivun ilman Tageja

Ja indeksi tiedosto jotenkin näin:
0 index.htm
768 index.htm#Osa1
1400 asia/index.htm
....

Suositeltavaa tehdä indeksitiedoto binäärisenä, jolloin kohdat löytyvät ilman merkkijonojen käsittelyä.
Tosin itse tein yksinkertaisen indeksoijan ja monimutkaisen hakukoneen. (En suosittele).

Hakurobottini oli puhtaasti tiedostopohjainen, joten tietokantaa ei ole.
PHP:llä ei kannata tehdä kuin käyttöliittymä, jos tekee siten kuin minä.
Ohjelmani on kuitenkin .exe, jota ajetaan jaetussa levyresurssissa.

ajv [16.09.2005 11:03:43]

#

Joo, homma selkeni. Itse ajattelin tunkea tuon raa'an datan tietokantaan, jolloin hausta saa helposti monipuolisen, kun voi käyttää tietokannan omia tekstihaku-ominaisuuksia.

"Hakurobotti" olisi kylläkin toteutettu PHP/PERL-skriptikielillä ja sitä voisi ajaa taustalla esim. screenissä siten, että kerran x minuutissa se indeksoi yhden sivun (x voisi olla esim. 10 => 144 sivua/vrk).

Tein tuossa eilen jo pienen algoritmin sivujen rekursiiviseen indeksoimiseen. Ensimmäinen ongelma tuntui olevan se, että esim. kalenterissa linkkejä löytyy loputtomiin, kun sitä selataan eteen/taaksepäin. Olisi myös mukavaa, ettei hakurobotti lähtisi indeksoimaan ulkopuolisia sivuja taikka yrittäisi ladata jotain 600 Mt:n videopätkää :) Nämä jälmikkäiset asiat vaikuttavat helposti ratkaistavilta, mutta ratkaisun pitäisi kuitenkin olla 99.99% varma ja sitähän siitä ei saa pelkästään domainia/tiedostopäätettä tarkkailemalla :/

tgunner [16.09.2005 12:06:03]

#

Minä joskus tein 'hakukoneen' JavaScriptillä. Joka etsi sivustoja jotka olin syöttänyt databaseen.
Se toimi aika hyvin ja oli suht'koht suosittu, mutta sitten lopetin sen koska en jaksanut lisäillä siihen sivustoja joita innostuneet Webmasterit lähettivät minulle päivittäin.
Kannattavaa olisi tehdä sellainen Googlen tyylinen META-hakija. Paitsi jos suunnittelee sivuilleen vain sellaista tavallista 'hakukonetta', jolla voi etsiä sivustoltaan jotain.

peran [16.09.2005 14:29:24]

#

ajv kirjoitti:

"Hakurobotti" olisi kylläkin toteutettu PHP/PERL-skriptikielillä ja sitä voisi ajaa taustalla esim. screenissä siten, että kerran x minuutissa se indeksoi yhden sivun (x voisi olla esim. 10 => 144 sivua/vrk).

Tein tuossa eilen jo pienen algoritmin sivujen rekursiiviseen indeksoimiseen. Ensimmäinen ongelma tuntui olevan se, että esim. kalenterissa linkkejä löytyy loputtomiin, kun sitä selataan eteen/taaksepäin. Olisi myös mukavaa, ettei hakurobotti lähtisi indeksoimaan ulkopuolisia sivuja taikka yrittäisi ladata jotain 600 Mt:n videopätkää :) Nämä jälmikkäiset asiat vaikuttavat helposti ratkaistavilta, mutta ratkaisun pitäisi kuitenkin olla 99.99% varma ja sitähän siitä ei saa pelkästään domainia/tiedostopäätettä tarkkailemalla :/

Jos on mahdollista tehdä indeksoitavia sivuja, niin kalenteri-ongelman voi ratkaista s.e. poistaa hakuropotilta kokonaan kalenterin indeksoinnin, ja tekee kalenterista sivun, jossa on koko kalenterin tapahtumat. Sitten vain indeksoi kalenterin tapahtumat-sivun.

Toinen vähän epätäydellisempi ratkaisu on rajata haku tietyn syvyiseksi, mutta välttämättä silloin ei tule koko hakupuuta.

Header-tiedoista saa tietoon tiedostojen tyypit, joilla voi rajata .html ja txt tyyppisiin tiedostoihin, jottei kuvien sisältöä ja videoleikkeitä turhaan indeksoi ja samalla hidasta hakujen tekemistä. Voi myös määritellä maksimikoon haulle. (Yli megaa on harvoin tekstiä).

Siinäpäs vinkkejä, jotka varmasti itsekin tiesit.

Ulkopuolisten sivustojen indeksoinnin estoon en ole keksinyt muuta kuin tutkia domainia.

ajv [16.09.2005 15:47:46]

#

Kiitos vinkeistä. Perusideana olisi rakentaa suoraan sellainen hakurobotti, jonka saisi toimimaan muuallakin, kuin tuolla joukkueemme sivuilla, joten ehkä ratkaisu kalenteri-ongelmaan löytyy tuolta hakupuun syvyyden rajaamisesta.

Ulkopuolisten sivujenkaan indeksointi ei ole ongelma omilla sivuillani, koska siellä ei uudelleenohjailla ulos tyylin jump.php?target=ulos. Tosin löytyisiköhän tuohon uudelleenohjaukseenkin ratkaisu http-headereista? No miten vaan. Tässä vaiheessa projekti tuntuu hieman epätoivoiselta virittelyltä. Jos kuitenkin saan oikeasti jotakin aikaan ja päätän jatkaa ilmoittelen tänne projektin edistymisestä :)

ajv [18.09.2005 01:02:33]

#

Noniin. Sain tuossa juuri ensimmäisen varsion hakurobotista valmiiksi. Kieleksi jäi kuitenkin se PHP, vaikka tässä olisi ollut oiva tilaisuus perehtyä johonkin muuhunkin kieleen.

Hakurobotti on todellakin vielä alpha-vaiheessa, mutta se osaa nyt pysyä omalla domainilla ja ei indeksoi muuta, kuin html:ää. Tuo kalenteri-ongelma on vielä ratkaisematta, mutta nyt tuli mieleen ehkä oleellisempi asia: miten erotella sisältö html-sivusta? Sivut ovat ikäänkuin raameissa, eli jokaisella sivulla on paljon samaa turhaa asiaa (mm. pieni kalenteri, josta jää pelkät numerot jäljelle, kun html-tagit strippaa pois). Ei nyt tule muutakaan mieleen, kuin kehitellä joku oma algoritmi etsimään sivuista nuo yhteneväisyydet.

Kuten odottaa saattoi, positiivista oli haun nopeus. Sivuja meni nyt ensimmäisellä onnistuneella indeksoinnilla kantaan vajaa 600 ja datamäärässä tuo vastaa 2 Mt. Yksinkertainen SQL-kysely suoriutui hausta muutamassa millisekunnissa ja sivut pompsahtivat esiin ilman ongelmia.

Kiitoksia tässä vaiheessa JTS:lle websivuntutkijan lähdekoodeista, joista sain muutaman aika oleellisen tärkeän regexpin, sekä funktion käyttööni lähes suoraan.

panttu [20.09.2005 23:30:43]

#

Jos sivut on luettavissa ilman kirjautumista niin silloinhan voisi hyödyntää esimerkiksi googlea heittämällä sille hakulausekkeeseen hakusanojen lisäksi kohteen.

site:www.sivuni.fi sana1 sana2 jne

ajv [22.09.2005 07:09:02]

#

panttu kirjoitti:

Jos sivut on luettavissa ilman kirjautumista niin silloinhan voisi hyödyntää esimerkiksi googlea heittämällä sille hakulausekkeeseen hakusanojen lisäksi kohteen.

Äh, tiedän, enkä tätä nyt ihan järkisyistä pelkästään teekkään :) Homma tuntuu mukavan haastavalta. Nyt viikolla en ole kerennyt koodaamaan tätä yhtään eteenpäin, mutta robo on ihan hyvässä vaiheessa. Luulen keksineeni tuohon sisällön eriyttämiseen layout-datastakin ihan ok alkkiksen.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta