/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
indexere et site
Fra : Leonard


Dato : 24-12-02 02:09

Jeg er begyndt på kodningen af en søgefunktion.

Den første plan var at have 3 tabeller:
sider: nr, titel, url
ord: id, ord
index: nr, id

hvor alle sider på sitet er i tabellen 'sider',
alle ord i 'ord' og 'index' så er en tabel over hvilke ord, der er på
hver side.

En simpel søgning på et ord vil så give nummeret på ordet og et udtræk
fra index vil give numre på de sider, hvor ordet findes.

Men det tager frygtelig lang tid for serveren at indexere på denne
måde, da jeg hele tiden skal tjekke om et ord er indexeret og hvis det
er så finde ordets nr.
Så nu har jeg tænkt på om det er bedre med en tabel:
side_titel, url, tekst
hvor alle ordene på en side bare står i tekst, evt så hvert ord kun
står en gang. Det vil fylde noget mere, men det er måske mindre
belastende for serveren?

Et andet problem er, at jeg får en:

Fatal error: Maximum execution time of 30 seconds exceeded on line 134
134:   if (!in_array($del, $link)) {

som jeg bruger til at tjekke om jeg har været på siden før, for så
skal den jo ikke indexeres igen.
Problemet opstår når der er indexeret ca. 1050 sider.

Hvad kan jeg gøre ved det?


 
 
Lars Dybdahl (26-12-2002)
Kommentar
Fra : Lars Dybdahl


Dato : 26-12-02 12:06

Det er en server-indstilling, hvor længe et php script må køre.

Enten skal du bede server operatøren om at ændre 30 sekunders indstillingen,
eller også må du lave dine scripts, så du deler opgaven op i mindre dele,
der så hver for sig tager mindre end 30 sekunder.

Indstillingen findes for at sikre serveren stabilitetet.

Lars.

Leonard wrote:
> Fatal error: Maximum execution time of 30 seconds exceeded on line 134


Niels Andersen (28-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 28-12-02 18:39

Lars Dybdahl wrote in <3e0ae28f$0$204$edfadb0f@dread12.news.tele.dk>:
>> Fatal error: Maximum execution time of 30 seconds exceeded on line 134
> Enten skal du bede server operatøren om at ændre 30 sekunders
> indstillingen, eller også må du lave dine scripts, så du deler opgaven op
> i mindre dele, der så hver for sig tager mindre end 30 sekunder.

Der er ingen grund til at tage fat i serverens administrator for det. :)

http://www.php.net/manual/en/function.ini-set.php:
Name - Default - Changeable
max_execution_time - "30" - PHP_INI_ALL

Dvs. værdien kan ændres i httpd.conf (eller tilsvarende), php.ini, .htaccess
(eller tilsvarende) samt i selve scriptet.

Mht. til det sidste, se: http://www.php.net/set_time_limit

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Thomas Lindgaard (27-12-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 27-12-02 21:11

Leonard <dennemailerikketilspam@tdc-broadband.dk> wrote in
news:39cf0vs4v3b1givjtk17nrn3q1kej852gb@4ax.com:

> Jeg er begyndt p† kodningen af en s›gefunktion.
>
> Den f›rste plan var at have 3 tabeller:
> sider: nr, titel, url
> ord: id, ord
> index: nr, id
>
> hvor alle sider p† sitet er i tabellen 'sider',
> alle ord i 'ord' og 'index' s† er en tabel over hvilke ord, der er p†
> hver side.
>
> En simpel s›gning p† et ord vil s† give nummeret p† ordet og et udtr‘k
> fra index vil give numre p† de sider, hvor ordet findes.
>
> Men det tager frygtelig lang tid for serveren at indexere p† denne
> m†de, da jeg hele tiden skal tjekke om et ord er indexeret og hvis det
> er s† finde ordets nr.

Jeg er også i gang med at kode noget søgning og har et tilsvarende
database-layout:

CREATE TABLE url (
id int(11) NOT NULL auto_increment,
url text,
PRIMARY KEY (id)
)

CREATE TABLE word (
id int(11) NOT NULL auto_increment,
word varchar(64) NOT NULL default '',
PRIMARY KEY (id)
)

CREATE TABLE word2url (
id int(11) NOT NULL auto_increment,
word_id int(11) NOT NULL default '0',
url_id int(11) NOT NULL default '0',
occurrences int(11) NOT NULL default '0',
PRIMARY KEY (id),
KEY word_id (word_id)
)

Alle de ord der forekommer på siderne vil være at finde i word-tabellen,
mens word2url afbilder ordene over på de enkelte sider samt fortæller hvor
mange gange ordet forekommer på den enkelte side. Url-tabellen indeholder
naturligvis adresserne.

Indekseringen skal foregå i to omgange:
1) Den første indeksering som skal sparke systemet i gang.
2) Den løbende indeksering, som skal holde indekset up-to-date hen ad
vejen.

Sitet består som udgangspunkt af små 200 sider (der er bl.a. et lille
debatforum hvor hvert indlæg bliver vist på sin egen side), så den
initielle indeksering kan klares på få minutter (11 minutter hvis man kun
henter en siden hvert 5. sekund for ikke at overbelaste serveren).

Den løbende indeksering skal efter planen håndteres ved følgende metode:
1) PHP henter den side som ændringen/tilføjelsen vil resultere i (den kan
jeg altid regne ud).
2) Overflødig tekst skæres væk (menu og lignende)
3) Ordene findes og indsættes i databasen sammen med adressen og bindinger
fra ord til url.

Dette er meget let at gøre for de "almindelige" sider mens det hurtigt
bliver lidt langhåret i debatforummet...

(Re-)indeksering af en side består dermed af 3 skridt:
1) Slet alt hvad der har med den pågældende side at gøre fra de tre indeks-
tabeller (dvs. slet url, word2url med det givne url-id og de ord DER KUN
FOREKOMMER PÅ NETOP DEN SIDE).
2) Find ordene på siden og det antal gange de forekommer.
3) Indsæt nogle ting i de tre tabeller igen.

Det giver noget i retning af 2 x (antal ord) + 1 indsættelser og lige så
mange sletninger i databasen ved oprettelse af en ny side/ opdatering af en
eksisterende side, men det har indtil videre vist sig at køre ganske
pænt...

Alternativet til en løbende indeksering må jo være at køre den med jævne
mellemrum, men så skal man jo have sat sådan noget cron-noget op, og det
har jeg ikke adgang til - og ved en løbende indeksering vil man jo også
kunne søge sig frem til en side med det samme, hvilket jo er en sjov ting.

.... men det kræver altså lidt kode at få det op at køre (kode som jeg ikke
helt har skrevet endnu).

Mvh.
/Thomas

Niels Andersen (28-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 28-12-02 18:49

Leonard wrote in <39cf0vs4v3b1givjtk17nrn3q1kej852gb@4ax.com>:
> Den første plan var at have 3 tabeller:
> sider: nr, titel, url
[...]
> Men det tager frygtelig lang tid for serveren at indexere på denne
> måde, da jeg hele tiden skal tjekke om et ord er indexeret og hvis det
> er så finde ordets nr.

Nu ved jeg ikke lige hvilken dbm du bruger, men med MySQL kan du gøre
følgende:

Læg alle de relevante informationer i én tabel. Fx::

CREATE TABLE sider (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
url VARCHAR(200),
titel VARCHAR(200),
tekst TEXT,
FULLTEXT (titel,tekst)
);

Så er det bare at fylde indhold i tabellen, så mangler du bare at lave selve
søgefunktionen.

Du kan læse mere her:
http://www.mysql.com/doc/en/Fulltext_Search.html

Der finder du også det eksempel, som jeg har taget udgangspunkt i, i
ovenstående tabel.

Det smarte her er, at du slipper for stort set alt arbejde med indexet, og
du kan utroligt nemt lave en søgefunktion, som giver meget gode resultater,
som sorteres efter relevans.

Fra MySQL 4.0.1 vil der oven i købet være mulighed for boolske søgestrenge,
helt uden at du skal gøre yderligere.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Leonard (31-12-2002)
Kommentar
Fra : Leonard


Dato : 31-12-02 00:12

On Sat, 28 Dec 2002 18:48:36 +0100, Niels Andersen
<niels-usenet@myplace.dk> wrote:

>Du kan læse mere her:
>http://www.mysql.com/doc/en/Fulltext_Search.html
>
>Der finder du også det eksempel, som jeg har taget udgangspunkt i, i
>ovenstående tabel.
>
>Det smarte her er, at du slipper for stort set alt arbejde med indexet, og
>du kan utroligt nemt lave en søgefunktion, som giver meget gode resultater,
>som sorteres efter relevans.
>
>Fra MySQL 4.0.1 vil der oven i købet være mulighed for boolske søgestrenge,
>helt uden at du skal gøre yderligere.

Og det er jo dejligt nemt
Men, der er kun MySQL 3.23.36 på mit webhotel, så jeg må se om jeg kan
overtale dem til at opgradere.
Indtil da mangler jeg en metode til at få de hits, hvor søgeordet kun
er begyndelsen af et ord:
søgeord: virksom
resultat: virksom, virksomhed, virksomheder

--
med venlig hilsen
Leonard - http://leonard.dk/

Niels Andersen (31-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 31-12-02 00:47

Leonard wrote in <aek11vk2qk5tuq7a5cv8skr0us7970sdre@4ax.com>:
> Indtil da mangler jeg en metode til at få de hits, hvor søgeordet kun
> er begyndelsen af et ord:
> søgeord: virksom
> resultat: virksom, virksomhed, virksomheder

Det har jeg haft brug for før. Hvordan var det nu... Jeg tror vist jeg løste
det ved at kombinere MATCH med LIKE.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Jacob Atzen (31-12-2002)
Kommentar
Fra : Jacob Atzen


Dato : 31-12-02 00:50

Leonard <dette.er.ikke.en.mail@der.virker.invalid> writes:

> Og det er jo dejligt nemt
> Men, der er kun MySQL 3.23.36 på mit webhotel, så jeg må se om jeg kan
> overtale dem til at opgradere.
> Indtil da mangler jeg en metode til at få de hits, hvor søgeordet kun
> er begyndelsen af et ord:
> søgeord: virksom
> resultat: virksom, virksomhed, virksomheder

Kan du ikke bare:
SELECT foo FROM table WHERE bar LIKE "needle%" ?

--
Med venlig hilsen
- Jacob Atzen

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste