WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   fulltextsökning i två kolumner samtidigt (https://www.wn.se/forum/showthread.php?t=16847)

radioaktivitet 2006-10-13 16:52

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
Jag har nästan en miljon rader i tabell P.

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

grazzy 2006-10-13 17:05

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 :D)

radioaktivitet 2006-10-16 14:20

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...

Jonas 2006-10-16 14:44

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
Gör inte nedanstående kod exakt samma som ovanstående?

Kod:

SELECT id, namn, tillverkare FROM p WHERE MATCH(namn, tillverkare) AGAINST ('mitt sökord' IN BOOLEAN MODE) ORDER BY relevance DESC

radioaktivitet 2006-10-16 15:54

Citat:

Originally posted by Jonas@Oct 16 2006, 14:44
Gör inte nedanstående kod exakt samma som ovanstående?

Kod:

SELECT id, namn, tillverkare FROM p WHERE MATCH(namn, tillverkare) AGAINST ('mitt sökord' IN BOOLEAN MODE) ORDER BY relevance DESC

Nej.

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? :)

kullervo 2006-10-16 21:09

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.

radioaktivitet 2006-10-18 14:44

Det låter bra! Men jag fattar ändå inte riktigt hur det fungerar i praktiken...


Alla tider är GMT +2. Klockan är nu 20:09.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson