[MySQL] Full-text search werkt niet goed

Pagina: 1
Acties:

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hoi,

Wanneer ik onderstaande code uitvoer worden de zoekresultaten netjes op relevantie gesorteerd, maar het grote nadeel is dat ik dan geen wildcards (*) kan gebruiken.

<?
$query = mysql_query("SELECT *, MATCH (titel,tekst) AGAINST ('$_POST[zoek]') AS score FROM obkbennekom_persberichten WHERE MATCH (titel,tekst) AGAINST('$_POST[zoek]') AND berichttype='1' ORDER BY score DESC") or die (mysql_error());
?>

Wanneer ik bovenstaande code uitvoer m.b.v. Boolean mode (zie onderstaande code) dan kan ik wildcards gebruiken maar kan ik niet sorteren op relevantie omdat de output van "score" overal 1 is.

<?
$query = mysql_query("SELECT *, MATCH (titel,tekst) AGAINST ('$_POST[zoek]' IN BOOLEAN MODE) AS score FROM obkbennekom_persberichten WHERE MATCH (titel,tekst) AGAINST('$_POST[zoek]' IN BOOLEAN MODE) AND berichttype='1' ORDER BY score DESC") or die (mysql_error());
?>

Hoe kan ik er voor zorgen dat ik met Boolean wel op relevantie kan sorteren?

[ Voor 16% gewijzigd door radem205 op 12-03-2006 15:18 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Dat is op te lossen door je de full text search die de relevantie selecteert niet in boolean mode te laten werken. Je moet dan wel even $_POST['zoek'] strippen op wildcards (en andere speciale tekens), anders wordt dat gewoon als onderdeel van een woord gezien. Je krijgt dan iets als dit:
PHP:
1
$query = mysql_query("SELECT *, MATCH (titel,tekst) AGAINST ('" . strip_full_text_search_chars($_POST['zoek']) . "') AS score FROM obkbennekom_persberichten WHERE MATCH (titel,tekst) AGAINST('$_POST[zoek]' IN BOOLEAN MODE) AND berichttype='1' ORDER BY score DESC") or die (mysql_error());

Die strip_full_text_search_chars functie moet je dan nog wel even zelf schrijven. Denk je verder ook even aan SQL injection?

Noushka's Magnificent Dream | Unity


  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Dit werkt helaas niet, of ik doe het niet goed

<?
$searchstring2=str_replace("*","",$searchstring);

$sql = "SELECT *, MATCH (titel,tekst) AGAINST ('" .$searchstring2. "') AS score FROM obkbennekom_persberichten WHERE MATCH (titel,tekst) AGAINST('$searchstring' IN BOOLEAN MODE) AND berichttype='1' ORDER BY score DESC";
?>

Moet dit zo werken volgens jou, of doe ik iet fout?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Dat zou idd moeten werken. Krijg je een error of gewoon geen resultaat?

Noushka's Magnificent Dream | Unity


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 23-02 17:28
Je hebt de hele ORDER BY-clause niet nodig, hij sorteert automatisch op relevantie, zoals in de manual ook wordt aangegeven.

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Ik krijg wel resultaat, maar wanneer ik op bijv. het woord slo* zoek dan geeft ie wel resulaten weer maar ik krijg geen relevantiescore terug. Als ik op sloop zoek dan krijg ik wel relevantiescore terug en sorteert ie ook op relevantie.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Dat komt omdat de minimale lengte van een Full Text Search woord 4 tekens moet zijn. slo zonder die * zijn er vier, vandaar dat de match die de score bepaald dan geen waarde heeft, omdat die nooit een resultaat geeft. Probeer sloo* maar eens. Dat werkt ook niet, omdat hij op volledige woorden zoekt. *sloop of sloop* oid werkt dan wel.

[ Voor 18% gewijzigd door Michali op 13-03-2006 18:23 ]

Noushka's Magnificent Dream | Unity

Pagina: 1