[PHP/MySQL] zoekmachine ontwerp

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 19:30
Ik ben al een tijdje op zoek naar de beste manier om een zoekmachine voor een database te maken.

Dan heb je aantal mogelijkheden:

Werken met MATCH en AGAINST:
Het is wel een mooie methode, maar er kleven voor de site waarop ik het wil gaan gebruiken enige nadelen aan. Het is namelijk de site van de JOVD (Jongerenorganisatie van de VVD), maar als je dan op VVD zoekt negeert hij dat woord omdat het 3 letters of korter is. Dat is dus een probleem.
Verder worden keywords die in meer dan 50% van de results voorkomen eruitgevist als noiseword.

Werken met LIKE in één keer:
code:
1
SELECT merp FROM lerp WHERE spef LIKE '%keywords%'

Maar hier blijft ie wel de keywords op volgorde pakken waarop ze opgegeven zijn

Werken met keywords gesplitst over meerder LIKES (andere woordvolgorde mogelijk)
code:
1
SELECT merp FROM lerp WHERE spef LIKE '%keyword1%' AND spef LIKE '%keyword2%' enz...

Het nadeel hiervan is dat als je aardig wat keywords hebt dat het dan volgens mij erg zwaar wordt voor de database.

Wat is dus de beste methode om dit aan te pakken?


Verder vroeg ik me nog af hoe je ongeveer searchresultaten kan opslaan in een speciale tabel daarvoor. Ik heb wat in de database van PhpBB zitten kijken, maar dat is maar vaag :/

Hij slaat het ongeveer op de volgende manier op:
a:7:{s:14:"search_results";s:1:"1";s:17:"total_match_count";i:1;s:12:"split_search";a:1:{i:0;s:7:"welcome";}s:7:"sort_by";i:0;s:8:"sort_dir";s:4:"DESC";s:12:"show_results";s:6:"topics";s:12:"return_chars";i:200;}
Het is mij niet duidelijk hoe die zoekresultaten hier nou in opgeslagen worden.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Er is geen beste methode, en er zijn vele wegen die naar rome leiden ;)

Ik kan je wel vertellen dat er minder goede, naar "slecht" neigende oplossingen zijn, en die van phpBB is er dus zo een. Kennelijk wordt daarmee de searchquery opgeslagen in de database dmv de PHP functie serialize. Laat het nu zo zijn dat in de beste database-ontwerpen (implementaties kan ik misschien beter zeggen) een database min of meer onafhankelijk van een 2e taal/platform moet kunnen functioneren. Met een zo goed als php-only functie dingen op te gaan slaan in een database is dan wel behoorlijk ranzig ;)

De 2e oplossing die je aandraagt na de FULLTEXT search, is in principe de betere oplossing. Je kunt dan zoekwoorden opslaan en linken met gegevens in je database. Dat een database (of delen daarvan) erg groot kunnen worden, dat geeft niet. Daar zijn het tenslotte databases voor ;)

Hoe je dat aan zou kunnen pakken is ongeveer als volgt:
let wel: er zijn meerdere mogelijkheden om dit te implementeren, dit is er 1tje van...

Je maakt een tabel in waarin je zoekwoorden zet:

table `search_word`
`search_word_id` (pk, autoincrement)
`search_word` (varchar, unique index)

en een tabel waarin je de verschillende woorden aan de records koppelt:
table `search_index`
`search_word_id` (compound primary key, integer)
`record_id` (compound primary key, integer)
`table_name` (compound primary key, varchar)
`word_count` (unsigned integer)
waarin dus records als deze voor kunnen komen:
'1', '1', 'news','5'

waar dus de eerste '1' verwijst naar het eerste woord uit de woordentabel, en de 2e '1' naar het eerste record uit de tabel 'news', en de `word_count` aangeeft hoe vaak het woord in dat record voorkomt.

't Is ietwat ranzig om je tabelnamen zo in een search_index te zetten, zullen sommigen zeggen, maar aan de andere kant wel zo goed als de meest flexibele methode. Verder maakt de search_index niet echt deel uit van je daadwerkelijke database ontwerp, maar is het meta-data (data die data beschrijft). Je kunt er dan dus lang over disussieren of het dan ook nog moet voldoen aan de "normale" database-richtlijnen, zal ik maar zeggen :)

Als je dus een flexibele zoekdatabase wilt maken die ook nog een "beetje" snel is, maar verder niet veel meer functionaliteit biedt, zou ik het ongeveer als hierboven beschreven doen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 01-09 23:08
verdiep je in de help van full text search van MySQL. Zeer leerzaam

woei!


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

PaszWerken:
verdiep je in de help van full text search van MySQL. Zeer leerzaam

Lees aub de thread voordat je post:
Werken met MATCH en AGAINST:
Het is wel een mooie methode, maar er kleven voor de site waarop ik het wil gaan gebruiken enige nadelen aan. Het is namelijk de site van de JOVD (Jongerenorganisatie van de VVD), maar als je dan op VVD zoekt negeert hij dat woord omdat het 3 letters of korter is. Dat is dus een probleem.
Verder worden keywords die in meer dan 50% van de results voorkomen eruitgevist als noiseword.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 19:30
Ik ga morgen aan de gang met het verhaal van drm.

Alleen zit ik nog met het 3 letter probleem. Ik las in de manual dat je dat getal kon veranderen maar dan moest je helaas access hebben tot de MySQL configuratie :/

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
misschien stomme vraag.. maar wrom zoekresultaten opslaan?

in de searchfunctie die ik ooit es geschreven heb explode ik eerst de zoekopdracht op losse worden.. en dan mbv een for loop loop ik die woorden langs en bouw ik een query met like steeds.. (of not like als er - voor het woord staat uiteraard :P ) werkt voor mij wel prima

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 19:30
nikao schreef op 24 February 2003 @ 10:58:
misschien stomme vraag.. maar wrom zoekresultaten opslaan?

in de searchfunctie die ik ooit es geschreven heb explode ik eerst de zoekopdracht op losse worden.. en dan mbv een for loop loop ik die woorden langs en bouw ik een query met like steeds.. (of not like als er - voor het woord staat uiteraard :P ) werkt voor mij wel prima
Maar wordt dat niet ontzettend zwaar als je een hele hoop keywords toe wil gaan passen op een aardig grote database :?

[edit]

Ik ben nu wat een het proberen met het bouwen van een LIKE query:

Ik heb er al inzitten:
- Noisewords importen uit PhpBB
- "dit is een textje" aan elkaar zoeken

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dit is "een brakke test die JRB toch goed werkt"
JRB is een noiseword, er zal niet naar gezocht worden.

Array
(
    [0] => Dit%
    [1] => is%
    [9] => %"een brakke test die toch goed werkt"%
)

%Dit%is%%"een brakke test die toch goed werkt"%
%Dit%is%een brakke test die toch goed werkt%
Array ( [1] => Dit [2] => is [3] => een brakke test die toch goed werkt ) 
SELECT * FROM merp WHERE title LIKE '%Dit%' AND title LIKE '%is%' AND title LIKE '%een brakke test die toch goed werkt%'

[ Voor 39% gewijzigd door Tux op 24-02-2003 11:36 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

LIKE queries worden op den duur inderdaad een stuk zwaarder dan geindexeerde searches.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
waarschijnlijk wel.. maar de vraag is of dat erg is :) ..
dit leek mij de handigste manier om ook +, - en " te kunnen gebruiken in de zoekopdracht
zodat een zoekopdracht als: '+snoep -drop lekker +"kinder" ' mogelijk is (ik noem ook maar wat :P

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

nikao:
waarschijnlijk wel.. maar de vraag is of dat erg is :) ..
dit leek mij de handigste manier om ook +, - en " te kunnen gebruiken in de zoekopdracht
zodat een zoekopdracht als: '+snoep -drop lekker +"kinder" ' mogelijk is (ik noem ook maar wat :P
Dan ga je al weer over hele andere dingen praten. Dat staat in principe los van hoe je de feitelijke zoekquery aan de database doet. Als je dergelijke functionaliteiten in je zoekmachine op wilt nemen, zul je toch aan de slag moeten met een analyzer/parser, hoe eenvoudig ook.

Vervolgens zal je tot een bepaald aantal zoekparameters komen, die in principe los staan van de keuze tussen een like, fulltext of zelf-geindexeerde search.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
drm schreef op 24 February 2003 @ 11:39:

[...]
Dan ga je al weer over hele andere dingen praten. Dat staat in principe los van hoe je de feitelijke zoekquery aan de database doet. Als je dergelijke functionaliteiten in je zoekmachine op wilt nemen, zul je toch aan de slag moeten met een analyzer/parser, hoe eenvoudig ook.

Vervolgens zal je tot een bepaald aantal zoekparameters komen, die in principe los staan van de keuze tussen een like, fulltext of zelf-geindexeerde search.
daar heb je ook weer gelijk in.. heb me daar ook eerlijk gezegd niet in verdiept .. leek me logisch om like te gebruiken..
zal die andere ook nog es onderzoeken.. (moet zowieso mijn zoekscripje nog es uitbreiden zie ik nu.. want +" " werkt niet aangezien ik alleen 1e char check vna het woor hehe :| )

ohw jah.. nogmaals mijn (misschien domme) vraag: waarom sla je die zoekopdracht op?

Acties:
  • 0 Henk 'm!

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 18:29

Pelle

🚴‍♂️

Een van de grootste nadelen van een FULLTEXT search is dat wanneer je bijvoorbeeld zoekt op 'programmeur' je dan geen records terugkrijgt waar 'programmeurs' in staat. Oftewel, je bent vaak op zoek naar een bepaalde tekst die niet in die exacte spelling in een van je gewenste resultaten staat, en die records worden dan ook niet gereturned.

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 19:30
Hoe zwaar het is voor de database valt volgens mij nog erg mee:

Als ik op één keyword zoek: 0.010891 sec. :)

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Het verschil wordt natuurlijk ook pas interessant of zelfs meetbaar bij grotere databases.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 19:30
Voor de JOVD zoekmachine ga ik LIKE gebruiken.

Maar ik heb nog een eigen applicatie waarvoor ik een searchengine probeer te maken.
Die is fulltext maar hij werkt niet helemaal :/
Ik heb even snel een testquery in elkaar gedraaid zonder relevantie e.d.
Maar hij werkt nogal vaag:

Staat er maar één record waarin ik wil zoeken dan krijg ik gewoon results terug. Maar zodra ik meerdere records heb dan krijg ik GEEN result terug van MySQL :(

Dus er is volgens mij iets fout met de query, maar ik heb niet echt veel ervaring met FULLTEXT

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
   r.*, 
   w.title AS topictitle 
FROM 
   replies_text t, 
   replies r, 
   topics w 
WHERE 
   MATCH 
      (t.reply_parsed) 
   AGAINST 
      ('Woei') 
AND 
w.id = r.topic_id

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb gewoon een script geschreven die om de n keer, de hele web-site afscand op nieuwe zoekwoorden; behalve het forum dan. Nu alleen nog aanpassen dat je het ook goed kan gebruiken voor andere web-site ;)
Pagina: 1