[php][mysql]2 vragen over FULLTEXT

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Ey,

De search heeft me al een heel eind op weg geholpen, maar ik heb nog 2 onbeantwoorde vragen. Ik gebruikte eerst LIKE voor het zoeken, maar omdat er niet op relevantie gesorteerd kan worden (misschien kan et wel, maar niet zo simpel) ben ik toch overgestapt naar FULLTEXT als er op relevantie gezocht moet worden (als er op datum gezocht moet worden, kijk ik nog, tis mijn eerste zoekmachine ;))

Ik heb nu de werkende query:

PHP:
1
2
$query = "SELECT id, titel MATCH ( titel, intro, inhoud ) AGAINST (  '$zoekterm' ) AS score 
FROM news WHERE  MATCH ( titel, intro, inhoud ) AGAINST (  '$zoekterm' )";


Echter, ik moet ook het veld intro hebben, doe ik echter

PHP:
1
2
$query = "SELECT id, titel, intro MATCH ( titel, intro, inhoud ) AGAINST (  '$zoekterm' ) AS score 
FROM news WHERE  MATCH ( titel, intro, inhoud ) AGAINST (  '$zoekterm' )";


Dan komt hij met een fout???? Hoe kan ik toch intro selecteren, of gewoon *, dat is me namelijk ook niet gelukt (wel zonder de score, maar dan is de relevantie weg :P)

Wat ik me ook afvraag is of het mogelijk is meerdere zoekwoorden te hebben, en hoe moet ik die dan scheiden? (een , ofzo??) Ik weet van het IN BOOLEAN, maar ik heb thuis geen 4.nogwat, en hoewel dat nog te regelen valt, heeft mijn hosting dat ook niet, ik moet het dus doen met versie 3.

edit:
even de php gesplits, layout was verneukt

[ Voor 6% gewijzigd door Roa op 17-07-2003 13:24 ]

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 17-07 14:45
PHP:
1
2
3
$query = "SELECT id, titel, intro, MATCH (titel, intro, inhoud) 
AGAINST ('".$zoekterm."') AS score 
FROM news WHERE  MATCH (titel, intro, inhoud) AGAINST ('".$zoekterm."')";


Volgens mij moet er nog een comma voor MATCH().
Je kan allerlei operatoren gebruiken met Full text search in mysql.

Standaard doet mysql volgens mij een OR search als je meerdere keywords meegeeft. Om dat te voorkomen of veranderen kan je bijvoorbeeld met quotes of plus tekens werken... Je hoeft dus geen comma als scheidingsteken te gebruiken, maar gewoon een spatie.

er staan een paar goede voorbeelden op de mysql site

[ Voor 49% gewijzigd door RupS op 17-07-2003 14:26 ]


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024
Volgens mij moet er nog een comma voor MATCH().
Merci, dat was de oplossing voor probleem 1.
Standaard doet mysql volgens mij een OR search als je meerdere keywords meegeeft.
Ja...eigenlijk wil ik dat veranderen
dat te voorkomen of veranderen kan je bijvoorbeeld met quotes of plus tekens werken... Je hoeft dus geen comma als scheidingsteken te gebruiken, maar gewoon een spatie.
Kan dus niet, want zoals ik al zei: ik kan geen IN BOOLEAN MODE doen, vanwege mysql versie 3.23.56

Is er nog een andere oplossing om het met AND te doen?

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 17-07 14:45
Roa schreef op 17 July 2003 @ 18:48:
[...]

Kan dus niet, want zoals ik al zei: ik kan geen IN BOOLEAN MODE doen, vanwege mysql versie 3.23.56

[..]
Juist ja... niet op gelet, sorry :)

Waarom gebruik je geen explode om je searchstring in een array te zetten en loop je vervolgens door die array heen om zodoende in je where statement verschillende MATCH() AGAINST() statements achter elkaar te plakken?
Dat is ook ongeveer wat ik doe (deed) bij het maken van een searchmethode met LIKE(). Je bouwt zeg maar je query dynamisch op... B)

Snel code voorbeeldje (type- en denkfouten voorbehouden) :)
PHP:
1
2
3
4
5
6
7
8
$zoekarray = explode(" ", $zoekterm);
$sql = "SELECT id, titel, intro, MATCH (titel, intro, inhoud)
AGAINST ('".$zoekterm."') AS score
FROM news WHERE ";
// en nu het loopen:
for ($i=0; $i<count($zoekarray);$i++) {
  $sql.= "MATCH (titel, intro, inhoud) AGAINST ('".$zoekarray[$i]."')";
}


Zo gaat het natuurlijk nog niet werken, je moet er nog wel een AND tussen gaan plakken e.d. Het is meer een idee...

Probleem hiermee is, dat je relevantie redelijk zinloos wordt, omdat iedere gevonden entry, elk woord bevat. Dat zou je zelf kunnen oplossen door bjiv. + en - tekens voor de zoektermen af te vangen, alleen kan je dan volgens mij gewoon beter ipv. het wiel opnieuw uitvinden, upgraden naar mysql 4.x :)