FAQ |
Kalender |
|
![]() |
#1 | |||
|
||||
Mycket flitig postare
|
Jag har en rätt klurig fråga.
Säg att jag har en databas med många företag i Sverige, med kolumnerna namn och stad. Håller på att bygga sökfunktionen men får det inte riktigt som jag vill. Jag vill exempelvis söka på "Apotek Västerås", frågan ser ut såhär: Kod:
SELECT *, MATCH(namn, stad) AGAINST('apotek sala') as score FROM foretag WHERE MATCH (namn,stad) AGAINST('apotek sala') ORDER BY score DESC Hur gör jag för att göra den smartare och ge mig mer exakta matchningar? Har nämligen så den visar antal träffar, och söker man på, i detta exempel, apotek sala och den visar hundratals så blir man som användare fundersam. Använder FULLTEXT + MySQL Mvh, |
|||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Having score > 5 t.ex.
Sedan är det väl inte nödvändigt att göra en match against för stad-kolumnen. Du kan ju köra where stad='Sala' |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Mycket flitig postare
|
Citat:
Det är ju fritext sökning, du ska alltså kunna söka på "apotek sala", "apotek", "sala" eller som du vill, och givetvis andra städer eller namn. Tack för svar |
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
Citat:
[mysqld] ft_min_word_len=3 Här har du en guide: http://www.electrictoolbox.com/mysql...x-word-length/ Testa det och återkom med resultat! |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Har WN som tidsfördriv
|
Strunta i att använda mysql fulltext, det suger. Kolla på Sphinx istället.
|
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Administratör
|
Sphinx/Solr är skalbara, snabbare och mer kapabla. Vill du använda MySQL fulltext search och få resultaten där båda matchar så får du göra en intersect mellan två fulltext sökningar. Och MySQL stödjer inte intersect så du måste göra en INNER JOIN mellan två fulltext search resultat ... vilket leder till en väldigt ineffektiv query ... och sen måste du ändå hämta ut datan med en tredje.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Klarade millennium-buggen
|
Ett lite jobbigare sätt är att lägga upp en separat tabell med de sökord du vill kunna söka på och ha en länktabell som länkar ihop sökordet med den verkliga förekomsten i din datatabell.
Då kan du låta din sökordstabell vara unikt indexerad och därmed få blixtnsnabba sökningar på sökorden. Sen får du göra en filtrering med hjälp av förekomsterna i länktabellen. Sökorden måste du då lägga upp när du lägger till nya och uppdaterar poster i din stora datatabell. Det blir mer jobb att skapa en sån lösning men det kan bli snabbare sökningar om du inte behöver 100% av fritextsökningens funktionalitet. |
||
![]() |
![]() |
![]() |
#8 | |||
|
||||
Mycket flitig postare
|
Citat:
|
|||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Administratör
|
Förutbestämda sökfrågor var något populärt för små projekt för 10+ år sedan för att det saknades bra tillgänglig teknik alternativt kunskap för att effektivt skapa smarta sökfunktioner. Sen kom diverse enklare implementationer i databaserna att bli vanligare, antingen med fulltext eller med en indexeringstabell. Gemensamt är att de inte är vidare flexibla, skalbara eller för den delen - enkla att använda på något annat sätt än väldigt ineffektivt så fort man vill ändra default-beteendet.
Nu finns dock två väldigt kompetenta specialiserade OSS mjukvaror i Sphinx och SOLR. Väljer du att använda MySQL (eller MSSQL, Oracle etc) som sökindex så har du också valt komplexitet, oflexibilitet, ineffektivet, <insert random negative attribute here>.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#10 | |||
|
||||
Mycket flitig postare
|
Citat:
Mvh, |
|||
![]() |
![]() |
Svara |
|
|