Kom ihåg mig?
Home Menu

Menu


fulltextsökning i två kolumner samtidigt

Ämnesverktyg Visningsalternativ
Oläst 2006-10-13, 16:52 #1
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
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
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-13, 17:05 #2
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
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 )
grazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-16, 14:20 #3
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
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...
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-16, 14:44 #4
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
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
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-16, 15:54 #5
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
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?
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-16, 21:09 #6
kullervos avatar
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2003
Inlägg: 1 519
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
kullervos avatar
 
Reg.datum: Dec 2003
Inlägg: 1 519
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.
kullervo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-10-18, 14:44 #7
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Det låter bra! Men jag fattar ändå inte riktigt hur det fungerar i praktiken...
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 21:43.

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