FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Flitig postare
|
Jag har ett litet problem. Jag har en stor tabell P med produktinfo. P innehåller tre kolumner. ID, NAMN och TILLVERKARE. Jag vill nu kunna söka fritextsöka i både NAMN och TILLVERKARE samtidigt. Idag har jag ett fritextindex för NAMN och ett för TILLVERKARE.
Så här ser en typisk fråga ut när man söker på namnet "namn" och tillverkaren "tillverkare" Kod:
SELECT ID, NAMN, TILLVERKARE, MATCH(NAMN) AGAINST ("namn") + MATCH (TILLVERKARE) AGAINST ("tillverkare") AS RELEVANCE FROM P WHERE MATCH(NAMN) AGAINST ("namn") AND MATCH (TILLVERKARE) AGAINST ("tillverkare") ORDER BY RELEVANCE DESC Problemet med denna fråga är att den tar väldigt lång tid att exekvera. Särskilt om man söker på namn och tillverkare som har flera ord i sig. Kan någon tipsa mig om hur jag kan effektivisera min fråga? Jag har funderat på att göra ett gemensamt index för NAMN och TILLVERKARE. Men nackdelen med den lösningen är att om jag söker på NAMN "abcd" så kan jag få träffar på TILLVERKARE som heter "abcd". Och det blir ju fel... :-) Jag kör mysql 4.0.25 |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
För att göra exakta sökningar är nästan det enda alternativet att koda en egen lösning. Fulltext kommer i princip aldrig att ge dig stabila (i datorvetenskaps-meningen) sökresultat.
Skriv en indexerare som går igenom allt material, filtrera bort stoppord, stemma och ta bort skräp, mata in orden i en tabell med ord och ett id till vilken rad i P ditt data hör till. Här kan du ju då även ange vikter och eller om det är data från namn eller tillverkare. Det är ett större projekt, men med fulltext kommer du _aldrig_ att kunna söka på detaljnivå - du får göra kompromisser då. Jag ser tacksamt emot att bli mästrad och korrigerad på denna punkt (kullervo etc ![]() |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Flitig postare
|
Kan du ge ett exempel?
Mitt problem är alltså att jag söker i två tabeller samtidigt. Det blir en join av två fritextsökningar. Vissa frågor kan ta 30 sekunder att exekvera... |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Klarade millennium-buggen
|
Kod:
SELECT ID, NAMN, TILLVERKARE, MATCH(NAMN) AGAINST ("namn") + MATCH (TILLVERKARE) AGAINST ("tillverkare") AS RELEVANCE FROM P WHERE MATCH(NAMN) AGAINST ("namn") AND MATCH (TILLVERKARE) AGAINST ("tillverkare") ORDER BY RELEVANCE DESC Kod:
SELECT id, namn, tillverkare FROM p WHERE MATCH(namn, tillverkare) AGAINST ('mitt sökord' IN BOOLEAN MODE) ORDER BY relevance DESC |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Flitig postare
|
Citat:
Exempel tabell P innehåller ID, NAMN, TILLVERKARE 1, gul banan, rune svensson 2, svart boll, sven karlsson 3, rosa bord, bertil banan sökning efter namnet "banan" och tillverkare "svensson" returnerar i ditt fall både 1 och 3. Men i mitt fall endast 1 eftersom bertil banan är en tillverkare. med andra ord. i mitt formulär har jag två input rutor. en för namnet och en för tillverkaren. i ditt fall behövs endast ett input ruta. Fördelen med mitt sätt är att sökresultatet blir bättre. något annat förslag? ![]() |
||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Bara ett inlägg till!
|
grazzys förslag låter riktigt bra. Vi funderar på en liknande lösning. Det blir mer flexibelt att göra det själv eftersom man slipper bygga in sig med databasmotor-specifik kod samt att man kan göra hela sökningen mer anpassad för ens applikation.
|
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Flitig postare
|
Det låter bra! Men jag fattar ändå inte riktigt hur det fungerar i praktiken...
|
||
![]() |
![]() |
Svara |
|
|