Kom ihåg mig?
Home Menu

Menu


Avancerad sökfråga (MySQL)

 
 
Ämnesverktyg Visningsalternativ
Oläst 2013-07-25, 23:16 #1
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Standard Avancerad sökfråga (MySQL)

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
Det finns totalt 1 apotek i Sala, vilket är det enda jag vill visa. Det frågan gör nu är att visa det rätta apoteket högst upp, följt med andra matchningar på antingen "apotek" eller "Sala"

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,
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-25, 23:25 #2
Erik Stenman Erik Stenman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2007
Inlägg: 2 154
Erik Stenman Erik Stenman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2007
Inlägg: 2 154
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'
Erik Stenman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-25, 23:34 #3
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Citat:
Ursprungligen postat av Erik Stenman Visa inlägg
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'
Testade innan med having score, söker jag på "apotek sal" så visar den 0 resultat, "apotek sala" så visar den 1, alltså för strikt. Sänker jag x (score > x) så visar den återigen orelevanta resultat.

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
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-29, 16:40 #4
Nihilnovi Nihilnovi är inte uppkopplad
Medlem
 
Reg.datum: Jun 2008
Inlägg: 233
Nihilnovi Nihilnovi är inte uppkopplad
Medlem
 
Reg.datum: Jun 2008
Inlägg: 233
Citat:
Ursprungligen postat av yakuzaemme Visa inlägg
Testade innan med having score, söker jag på "apotek sal" så visar den 0 resultat, "apotek sala" så visar den 1, alltså för strikt. Sänker jag x (score > x) så visar den återigen orelevanta resultat.

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
Anledning till att du får 0 resultat på "apotek sal" är för att "sal" är för kort. Vill du kunna fulltext söka på 3 bokstäver så måste du ändra detta:

[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!
Nihilnovi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-26, 12:33 #5
b_anderssons avatar
b_andersson b_andersson är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2004
Inlägg: 1 067
b_andersson b_andersson är inte uppkopplad
Har WN som tidsfördriv
b_anderssons avatar
 
Reg.datum: Apr 2004
Inlägg: 1 067
Strunta i att använda mysql fulltext, det suger. Kolla på Sphinx istället.
b_andersson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-26, 12:50 #6
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
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.
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-26, 13:22 #7
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-26, 13:35 #8
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
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.
Tror inte det skulle fungera så bra i praktiken då det ska användas för att visa resultat på olika företag runtom Sverige, ca 9000 inlagda i dagsläget. Du ska alltså kunna söka på "Apotek Göteborg", "McDonalds Fagersta" osv osv, så att ha förbestämda sökfrågor fungerar inte så bra.
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-26, 14:08 #9
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
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>.
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-26, 14:44 #10
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Citat:
Ursprungligen postat av Clarence Visa inlägg
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>.
Låter helt klart intressant och vill kolla in i det, men MySQL är det enda som kan användas i dagsläget, så måste tyvärr köra med det.

Mvh,
yakuzaemme ä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 23:36.

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