Een tijdje geleden had ik een topic geopent waarin ik vroeg of er een manier is om de relevantie te bepalen aan de relevantie die mysql terug geeft én de datum. (dit met een FULL TEXT SEARCH dus).
Dit is dus de betreffende zoek sql
<?php
$s_sql = "SELECT *, MATCH(`titel`) AGAINST ('>".$s."') AS `relevantie` FROM nieuws WHERE MATCH (titel,korttekst,tekst) AGAINST ('".$s."' IN BOOLEAN MODE) ORDER BY datum DESC, relevantie DESC";
?>
Nu heb ik nog eens goed en hard lopen/zitten denken. En kwam ik tot het volgende idee.
Ik wil laten sorteren op de relevantie.
En hoe wil ik die relevantie nu berekenen? Deel 1: MySQL retourneerd een relevatie...
Deel 2 De datum is als timestamp, dus een 10 cijferig getal... Als ik dit getal deel door de huidige timestamp... dan komt er bij een nieuw artikel een hoger getal uit dan bij een ouder... Maar omdat ik de relevantie belangrijker vindt dan de datum doe ik het getal wat uikomt ( >= 1 ) * 0.75.
Vervolgens tel ik de relevantie welke is berekend bij Deel 1 + Deel 2 en hier moet deze dan op gaan sorteren.
Echter is dit een vrij ingewikkeld iets... en ik weet hoe je dingen kan selecteren uit de database, er inzetten, een beetje laten zoeken verwijderen en al dat... maar dit is toch nog iets te ingewikkeld, vandaar dat ik hier hulp zoek. Ik denk dat dit niet alleen voor mij, maar ook voor andere php'ers interessant kan zijn...
Maar als ik dit gebruik, wat jij voorstelde, werkt het ook nog niet...
<?php
$s_sql = "
SELECT
DATEDIFF(datum, CURDATE()) AS verschil,
MATCH(titel) AGAINST('".$s."' * 2) AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."' * 0.5) AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."' * 1.25) AS kort_relevantie
FROM nieuws
ORDER BY ((DATEDIFF(datum, CURDATE()) / 0.5) * titel_relevantie * tekst_relevantie * kort_relevantie) DESC";
?>
Ik krijg namelijk deze error: 'Onbekende kolom 'titel_relevantie' in order clause'
Deze error kreeg ik net ook, alleen kon hij kolom verschil (van de datum) niet vinden.
dus ik dacht.. als ik die error van het verschil weg kan werken dmv die 'DATEDIFF(datum, CURDATE())' na ORDER BY te zetten. Kan dat ook wel als ik de rest daar weer achter zet en ik zet een * tussen de regels zodat hij het vermenigvuldigt.
Dus dit maakte ik erven:
<?php
$s_sql = "
SELECT
DATEDIFF(datum, CURDATE()) AS verschil,
MATCH(titel) AGAINST('".$s."' * 2) AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."' * 0.5) AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."' * 1.25) AS kort_relevantie
FROM nieuws
ORDER BY ((DATEDIFF(datum, CURDATE()) / 0.5) *
MATCH(titel) AGAINST('".$s."' * 2) *
MATCH(tekst) AGAINST('".$s."' * 0.5) *
MATCH(korttekst) AGAINST('".$s."' * 1.25) DESC";
?>
Maar helaas nu krijg ik wéér een error. Namelijk deze: 'Er is iets fout in de gebruikte syntax bij 'DESC' in regel 10'
Ik heb nu dit:
<?php
$s_sql = "
SELECT
(DATEDIFF(datum, CURDATE()) +
MATCH(titel) AGAINST('".$s."') * 2 +
MATCH(tekst) AGAINST('".$s."') * 0.5 +
MATCH(korttekst) AGAINST('".$s."')) * 1 AS relevantie,
titel,
DATEDIFF(datum, CURDATE()) * 0.1 AS datum_relevantie,
MATCH(titel) AGAINST('".$s."') AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."') AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."') AS kort_relevantie
FROM nieuws
ORDER BY relevantie ASC";
?>
Dit werkt wel goed... alleen de datum telt nog veelste zwaar mee, die mag wel / 10. Het lukt me alleen nog niet om enkel de datum /10 te doen... :$
Waarom zou je niet alleen de datum door 10 kunnen delen? Gebruik haakjes ( en ) om dat deel aan te geven dat je wilt gaan delen:
(DATEDIFF(datum, CURDATE()) / 10 )
met
<?php
$s_sql = "
SELECT
(DATEDIFF(datum, CURDATE()) * 0.1 +
MATCH(titel) AGAINST('".$s."') * 2 +
MATCH(tekst) AGAINST('".$s."') * 0.5 +
MATCH(korttekst) AGAINST('".$s."')) * 1 AS relevantie,
titel,
DATEDIFF(datum, CURDATE()) * 0.1 AS datum_relevantie,
MATCH(titel) AGAINST('".$s."') * 2 AS titel_relevantie,
MATCH(tekst) AGAINST('".$s."') * 0.5 AS tekst_relevantie,
MATCH(korttekst) AGAINST('".$s."') AS kort_relevantie
FROM nieuws
ORDER BY relevantie DESC";
?>
Nog een vraagje dan? Hoe krijg ik de resultaten waar dus tekst_relevantie == 0 uitkomt weg... Want die zijn dus totaal niet relevant dus wil ik ook niet in mijn lijstje krijgen
In php zou ik het wel kunnen, maar dit is natuurlijk niet de netste/snelste oplossing neem ik aan.
Edit: Laat maar, ik wilde er dus WHERE tekst_relevantie > 0 tussen zetten, maar toen deed hij het dus niet wat Klaasjan waarschijnlijk bedoelde. Dus heb ik daar WHERE MATCH(tekst) AGAINST('".$s."') * 0.5 > 0 van gemaakt, en nu werkt hij :D