webForumDet fria alternativet

Avancerad sökalgoritm

7 svar · 822 visningar · startad av startail

startailMedlem sedan sep. 2000155 inlägg
#1

Hej,

Jag har problem med att fundera ut hur jag skall göra en avancerad sökalgoritm med MySQL.

Jag har en sökterm som kan bestå av ett eller flera ord, som skall kollas mot en databas med flera olika celler.

Tex skall en sökterm på 3 ord matchas mot id, namn och typ.

Om söktermen är "grön röd gul" skall det kollas om något fält i id, namn och typ innehåller något av dessa ord.

På något sätt skall detta göras med AND/OR/LIKE satser, men jag kan inte komma på hur man gör på något bra sätt.

headbugMedlem sedan sep. 2006867 inlägg
#2

En SQL-fråga skulle kunna vara

SELECT id, namn, typ FROM MINTABELL WHERE id like '%grön%' or id like '%röd%' or id like '%gul%' or namn like '%grön%' or namn like '%röd%' or namn like '%gul%' or typ like '%grön%' or typ like '%röd%' or typ like '%gul%'

Sen beror det såklart på om du vill ha exakt likhet då får man byta ut like mot = och ta bort alla %-tecken.

Det finns dock mig veterligen inget enkelt sätt att söka efter 3 termer på en gång utan man får söka efter var och en för sig.

Sedan har du problemet att du måste skapa SQL-frågan på något sätt.

Detta gör du enklast utanför SQL i den miljö du läser in söktermerna. Är det PHP eller motsvarande eller en applikation som du programmerar själv så kan du bygga upp din SQL-fråga dynamiskt.

Räcker det som vägledning för att få dig på rätt spår? Annars kanske du kan berätta om vad du försöker göra och i vilken miljö du bygger i.

Fredde MannenMedlem sedan nov. 20014 054 inlägg
#3

startail skrev:

Hej,

Jag har problem med att fundera ut hur jag skall göra en avancerad sökalgoritm med MySQL.

Jag har en sökterm som kan bestå av ett eller flera ord, som skall kollas mot en databas med flera olika celler.

Tex skall en sökterm på 3 ord matchas mot id, namn och typ.

Om söktermen är "grön röd gul" skall det kollas om något fält i id, namn och typ innehåller något av dessa ord.

På något sätt skall detta göras med AND/OR/LIKE satser, men jag kan inte komma på hur man gör på något bra sätt.

du får bygga upp en dynamisk sql-sats, sedan måste du bestämma dig för om samtliga skall vara AND eller om samtliga skall vara OR. Eller om användaren skall få avgöra.

Du kan bygga en parser om användaren får avgöra om det skall sökas på:

Green OR Blue

eller

Green AND Blue OR Red

startailMedlem sedan sep. 2000155 inlägg
#4

headbug skrev:

En SQL-fråga skulle kunna vara

SELECT id, namn, typ FROM MINTABELL WHERE id like '%grön%' or id like '%röd%' or id like '%gul%' or namn like '%grön%' or namn like '%röd%' or namn like '%gul%' or typ like '%grön%' or typ like '%röd%' or typ like '%gul%'

Jag löste detta med att göra en SQL sats med XOR

SELECT id, namn, typ FROM [tabell] WHERE (id LIKE '%grön%' XOR namn LIKE '%grön%' XOR typ LIKE '%grön%')

Sen repeterar jag bara bara nästa ord på samma sätt med en "AND" sats mellan dem.

SPiNMedlem sedan mars 20007 896 inlägg
#5

Kolla istället in MySQL's full-text search. Du kan tuna det lite som du vill och det är väldigt snabbt, och returnerar resultatet efter relevans. Fungerar doch enbart mot MyISAM och minsta matchningslängd är 4 tecken.

startailMedlem sedan sep. 2000155 inlägg
#6

Jag har kommit fram till att lösningen med XOR inte var helt sann.
Om fler än ett av cellerna innehåller ordet i fråga som söks på så ges inga resultat eftersom den förväntar sig att bara en cell skall innehålla ordet.

Full-text search är inte heller något alternativ eftersom den automatiskt kommer att sortera ut vanliga ord, vilket inte är något jag vill att den skall göra. Allting i databasen skall vara sökbart.

Om någon har en lösning skulle jag bli glad :)

headbugMedlem sedan sep. 2006867 inlägg
#7

startail skrev:

Jag har kommit fram till att lösningen med XOR inte var helt sann.
Om fler än ett av cellerna innehåller ordet i fråga som söks på så ges inga resultat eftersom den förväntar sig att bara en cell skall innehålla ordet.

Full-text search är inte heller något alternativ eftersom den automatiskt kommer att sortera ut vanliga ord, vilket inte är något jag vill att den skall göra. Allting i databasen skall vara sökbart.

Om någon har en lösning skulle jag bli glad :)

Jamen, om det nu är ett problem att det ska kunna finnas %grön% i flera kolumner så använd OR istället för XOR? Det är ju precis den effekten du får då ju! Varför valde du XOR istället för OR i första taget? Var det något med OR som ställde till det för dig?

spangoMedlem sedan juni 20008 205 inlägg
#8

En sökning som görs med LIKE '%sökterm%' skalar helt absurt dåligt. Den som tar sig en minut att titta igenom manualen hittar följande:

Manualen skrev:

To override the default stopword list, set the ft_stopword_file system variable. (See Section 5.1.3, “Server System Variables”.) The variable value should be the path name of the file containing the stopword list, or the empty string to disable stopword filtering.

Så, stäng av stoppordsmatchningen och använd fulltextindex.

123 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
121 ms — hämta tråd, inlägg och bilagor (db)