PHP/MySQL - Full text search fler sökord

Permalänk
Medlem

PHP/MySQL - Full text search fler sökord

Har fått min Full Text search att fungera, men nu återstår problemet att få med flera sökord och dessutom i mitt fall lägga till * kring alla ord så den söker på dem även om de bara är delar av ord.

$query = mysql_real_escape_string($_GET["query"]); $query = preg_replace("/[^a-z0-9\s]/", "", $query); $q_result = mysql_query("SELECT *, MATCH(Name) AGAINST('*$query*' IN BOOLEAN MODE) AS score FROM Example WHERE MATCH(Name) AGAINST('*$query*' IN BOOLEAN MODE) ORDER BY score");

Vad bör man göra för att få * kring alla ord och göra så den får med alla orden i sökningen? I dagsläget om jag inte förstår detta fel så söker den efter en sträng som innehåller de ord du skriver även om du separerar med space. Vad rekommenderas?

Permalänk
Medlem

Enklaste sättet att läsa detta är nog att splitta $query på space (explode), lägga till "*" runt varje sträng i den returnerade arrayen och sedan sätta ihop en ny $query-sträng med implode.

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

Jag testade faktiskt detta precis:

$query = strtolower(mysql_real_escape_string($_GET["query"])); $query = preg_replace("/[^a-z0-9\s]/", "", $query); $query = explode(" ", $query); for ($i = 0; $i<count($query); $i++) { if ($i > 0) { $q_search = $q_search . " +*" . $query[$i] . "*"; } else { $q_search = $q_search . "+*" . $query[$i] . "*"; } } $q_result = mysql_query("SELECT ID, Name AS title, MATCH(Name, Description) AGAINST('$q_search' IN BOOLEAN MODE) AS score FROM Categories WHERE Activated='True' AND MATCH(Name, Description) AGAINST('$q_search' IN BOOLEAN MODE) ORDER BY score");

Men jag får inte det resultat jag förväntar mig. Har jag t.ex. 2 strängar med detta innehåll:
Text1:
"abc 123"
Text2:
"abc"
Skriver jag nu i sökfältet "abc" får jag upp båda, skriver jag "123" får jag endast Text1. Men det som förbryllar mig är, skriver jag "abc 123" så får jag båda texterna. Några idéer?

Permalänk
Medlem

Testat ännu mer nu och har i princip samma problem som innan. dvs. att det går att söka efter 1 ord eller meningar men det fungerar inte som jag vill när jag separerar ord med space, så att den söker efter dem separat. några tips?

Permalänk
Medlem
Skrivet av Zelloxy:

Testat ännu mer nu och har i princip samma problem som innan. dvs. att det går att söka efter 1 ord eller meningar men det fungerar inte som jag vill när jag separerar ord med space, så att den söker efter dem separat. några tips?

Vet inte om jag riktigt greppar vad du är ute efter, men så som det är ska det också vara med fulltextsökning. Om orden är separerade med mellanslag innebär inte detta att alla orden måste finnas i sökresultaten, dvs. ett mellanslag tolkas som operatorn OR/eller. Vill du istället att något ord måste finnas, eller inte får finnas, i sökresultatet ska du ha "+" respektive "-" som prefix för ordet i fråga, mao fungerar det likadant som hos alla sökmotorer, exempelvis google.

Framgår också, föga förvånande, hur detta fungerar i MySQL:s dokumentation (finns också fler operatorer). MySQL :: MySQL 5.1 Reference Manual :: 11.8.2 Boolean Full-Text Searches

Permalänk
Medlem

Nu har jag inte läst länken jag fick än men ska göra detta under dagen. Har dock en fråga. Om du tittar på mitt senaste inlägg så har jag lagt till "+" innan orden för att de ska inkluderas i sökningen och INTE agera som OR/eller. Men då är frågan, ska det skrivas på det viset, t.ex.: "+*search_word*"?

Edit:
När jag tittade närmre på min sökfunktion och testade t.ex. söksträngen "asd 123" igen. Den görs alltså om till "+*asd* +*123*" men jag får endast upp sökträffar som har med "asd" att göra. Vet inte om det hjälper någon. Själv ska jag läsa vidare, säger till om jag kommer på en lösning.