Sökfunktion PHP/MySQL - Får det inte att fungera.

Permalänk
Medlem

Sökfunktion PHP/MySQL - Får det inte att fungera.

Vad gör jag fel, varför listar den inte svarsresultaten. Om jag ber om en så enkel sökterm som "of" från News så borde den hitta alla som innehåller detta. Jag är väldigt ny till denna metoden av sökning men den verkar lovande (om jag någon gång får igång det).

$query = strtolower(mysql_real_escape_string($_GET["query"])); $query = preg_replace("/[^a-z0-9\+]/", "", $query); $q_result = mysql_query("SELECT ID,Headline, Text, MATCH(Headline, Text) AGAINST('%$query%' IN BOOLEAN MODE) AS score FROM News WHERE MATCH(Headline, Text) AGAINST('%$query%' IN BOOLEAN MODE)"); if (mysql_num_rows($q_result) == 0) { echo "No results were found."; } else { echo "<table width=\"100%\"><tr> <td>Results</td> <td>ID</td> <td>Headline</td></tr>"; while ($row = mysql_fetch_array($q_result)) { echo "<tr> <td>" . $row['score'] . "</td> <td>" . $row['ID'] . "</td> <td>" . $row['Headline'] . "</td> </tr>"; } echo "</table>"; }

Några idéer :)?

Permalänk
Medlem

Jag har ingen erfarenhet av full text-sökningar i MySQL, men "%word%"-syntaxen gäller väl bara i en LIKE clause, d.v.s. '%$query%' borde väl vara '$query' eller '$query*'? (Se. Boolean Full-Text Searches.)

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Det har du rätt i. Men jag har testat både med och utan, så det är inte där problemet ligger. Ska läsa vidare och se vad det kan vara.

Permalänk
Medlem

Funderar nästan på om man ska gå över till LIKE istället? Är det något ni rekommenderar och i så fall hur ska jag börja?

Permalänk
Medlem

Kidnappar denna tråden då jag har fått nya problem :/

varför fungerar inte:

SELECT Categories.ID, TheWall.ID FROM Categories, TheWall WHERE Categories.URL='development' AND TheWall.ID=13 INNER JOIN TheWall ON Categories.ID=TheWall.CategoryID

Permalänk
Medlem

Finns regulära uttryck i MySQL också, vilket förstås är mycket kraftfullare än LIKE som bara tar jokertecken. Det gäller dock att skapa rätt index och formulera sökningarna därefter för att få rimlig prestanda, oavsett vilken av dessa tekniker man använder. Fast är det små datamängder spelar det oftast ingen roll.

Vad är det för texttyp du ska söka med och i? Fulltextsökningar är den teknik du ska använda om du vill söka på ord i textmängder av naturligt språk såsom svenska och engelska. Till att börja med måste du använda MyISAM-motorn för tabellen och rätt datatyper (VARCHAR eller TEXT). Ett fulltextindex måste skapas också (kan inte komma på just nu hur det skulle kunna fungera annars). Kom ihåg att fulltextindex skiter oftast i vanliga ord som "och", "eller", "så" etc. eftersom de ytterst sällan påverkar sökkvaliteten.

Permalänk
Medlem
Skrivet av Zelloxy:

Kidnappar denna tråden då jag har fått nya problem :/

varför fungerar inte:

SELECT Categories.ID, TheWall.ID FROM Categories, TheWall WHERE Categories.URL='development' AND TheWall.ID=13 INNER JOIN TheWall ON Categories.ID=TheWall.CategoryID

För att JOIN kommer före WHERE och du inte ska ha tabellen i både FROM och som JOIN:

SELECT c.ID, w.ID FROM Categories AS c INNER JOIN TheWall AS w ON c.ID = w.CategoryID WHERE c.URL = 'development' AND w.ID=13

Föreslår att du tar dig en titt i manualen, SELECT Syntax visar hur frågan ska se ut.

Visa signatur

WS: Fractal Design Pop Silent | Seasonic Prime G12 GC 550W | Gigabyte B650 Eagle AX | Ryzen 7 7700 | Corsair 64GB DDR5 | Asus Xonar DX | Arch Linux (x86_64) | Eizo EV2795
HTPC: Philips 50PUS8804, Kodi samt extern usb-disk
Server: Raspberry Pi 4 | 8GB RAM | HDD 750GB | Arch Linux (armv7h)