Permalänk
Medlem

Sql fråga

Säg att jag samlat en massa information från en massa ställen till en databas.

men de olika ställerna presenterar texten olika så min tabell kan bli
1. bla hej tjo
2. hej tjo bla
3. tre fis bla

hur får jag ut alla rader som innehåller orden bla tjo

om jag skriver where column like %bla%tjo%
kommer jag ju inte få med den 2. raden

tacksam för snabbt svar. har sökt på mysql dokumentationen men inte hittat nåt tillfredställande. det närmaste var regexp men jag är inte så haj på det.

Permalänk
Medlem

select * from tabell where grejj = 'bla' OR grejj = 'tjo'

de borde väl funka?

edit: eller: grejj like '%bla%' or grejj like '%tjo%'
om du måst eha de.

edit2: eller dom skulle innehålla båda orden? då blir de:
select * from tabell where grejj like '%bla%' AND grejj like '%tjo%'

Visa signatur

Hej

Permalänk
Medlem

grejjen är att detta är en funktion som ska kunna söka på många ord. ibland kanske man söker efter bara tjo pelle.
men ibland kanske hej pelle tjo
därför kan jag inte sätta grej=tjo and grej=nisse
efter som det varierar

Det är lite hysh hysh om vad jag igentligen söker efter
därför alla tjo och pelle

Permalänk
Hedersmedlem

Smäll in alla sökord i en array:

$keywords = array( 'test%', '%bajs%', 'test2' );

Sen kan du göra något sånt här kanske:

'SELECT * FROM bah WHERE habbu LIKE \''. implode( '\' OR habbu LIKE \'', $keywords ). '\''

Tänk dock på att sökningar med LIKE på stora textmassor är allt annat än snabbt. Om bra prestanda är ett krav borde du indexera sökorden på något vettigt sätt.

Permalänk
Medlem

Ett tips är att du tittar på fulltextsökningar som mysql klarar av... både med och utan (utan = ifall du vill dra ner på diskytan databasen tar).

Där kan man använda sig av boolean search a'la altavista (dvs +tjo +pelle)... du kan testa detta på http://download.apachez.net/tbgv2

Permalänk
Hedersmedlem

Tänk dock på att MySQL's fulltext index inte är tänkt som ett alternativ till en "riktig" sökmotor. Sökningar på fulltext-index i MySQL på stora datamängder är inte snabbt. Något jag lärde mig alldeles för sent i mitt forum och nu har fått fixa i efterhand.

Permalänk
Medlem

Fulltextsökningen i version 4 av mysql är riktigt trevlig och snabb... men den går att få snabbare enligt mysql's todo lista. Det som är värt att tänka på dock är att fulltextindexet växer MINST lika mycket som datamängden i tabellen vilket gör att många stänger av fulltextindexeringen och kör enbart boolesk sökning och då tar det tid. Med fulltextindexeringen aktiverad går det tokfort men å andra sidan tar databasen dubbelt så mycket diskyta realtivt när fulltextindexeringen är avstängd.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Apachez

Fulltextsökningen i version 4 av mysql är riktigt trevlig och snabb... men den går att få snabbare enligt mysql's todo lista. Det som är värt att tänka på dock är att fulltextindexet växer MINST lika mycket som datamängden i tabellen vilket gör att många stänger av fulltextindexeringen och kör enbart boolesk sökning och då tar det tid. Med fulltextindexeringen aktiverad går det tokfort men å andra sidan tar databasen dubbelt så mycket diskyta realtivt när fulltextindexeringen är avstängd.

Nu har jag iofs inte testat fulltext i MySQL 4 i någon större utsträckning, men jag tvekar på att de har förbättrat den så radikalt vad gäller prestanda. I MySQL 3.* är den nämligen helt obrukbart långsam. Jag laborerade lite med fulltext-sökningar i ett text-fält på detta forums databas (202000 inlägg var det då) och det var ingen rolig upplevelse (vi pratar flera sekunder på en P2-450/192mb här i mitt kök). Jag har nu kört i väggen vad gäller sökfunktionaliteten i mitt forum och jobbar för tillfället på att helt och hållet byta ut den.

Det finns utöver prestandaproblemet ett par andra saker som hindrar mig från att använda fulltext-index i mitt forum. Den första klara nackdelen är att väldigt få host:er använder MySQL 4. Den anses fortfarande vara beta och det kommer nog ta ett tag innan den lämnar detta stadium. En annan nackdel är att det inte finns någon möjlighet att styra vilka ord som skall och vilka som inte skall indexeras. För tillfället har MySQL bara en intern lista med engelska "stopwords" och är det svensk text man indexerar kommer det finnas en massa "brus" i indexet vilket sänker prestanda och minskar träffsäkerheten i en sökning. Det går att redigera denna lista, men då får man manuellt redigera en bit källkod och kompilera om. Inte direkt funktionellt om man kodar ett forum som andra ska använda (på olika språk). Den största nackdelen är nog dock att det är MySQL-specifikt. Alla olika databaser implementerar fulltextsökning på sitt eget sätt och det blir en hel del fulhack för att stöda flera olika RDBMS. Vissa databaser har inget fulltext-stöd alls förutom i form av externa plugins och moduler (mssql, postgresql...).

Mitt tips är som följer. Om man inte har något behov av att ha portabilitet gentemot andra databaser (och host:er) och om det man indexerar inte är stora textkolumner kan man mycket väl använda fulltext-index. I alla övriga fall bör man överväga att implementera en egen sökindexering.

Fan, nu lät det nästan som en rant. Det var det inte tänkt som

Permalänk
Medlem

Som jag förstår det så måste man sätta nån form av fulltext index för att köra me boelon search right?

Edit: såg att det bara gällde version 4. så jag kör på kennels array function. för alla alternativ verkar slöa

Permalänk
Medlem

Till Kennel (och även andra

Finns en hel del hostar som redan idag kör version 4 av mysql bla yahoo. Just fulltextsökningarna är något som har förbättrats i version 4 av mysql.

Dessutom kommer sökning mot fulltextindex alltid vara snabbare än "like" sökningar när vi talar om två eller fler (kan hända även för ett sökord också men skillnaden lär öka med fler sökord) sökord på textmängder som i sin tur leder till (vid använde av index) mindre last på databasservern.

Just stopwordlistan kommer med lite tur att petas ut som en cfg fil i kommande versioner men fördelen med att ha den förkompilerad är just att den då redan ligger inne i databasen som tack vare att mysql är opensource inte ger samma problem som tex med mssql ifall man vill ändra på något

Vidare har iaf mssql 2k möjligheter till fulltextindexering utan externa plugins.

Men det handlar hela tiden om en tradeoff när man grottar med fulltextindex.

Dom är grymt snabba men tar samtidigt grymt mycket diskyta.

(Det är något som jag sitter och grubblar på gällande TBGv2, en sökning med fulltextindex tar 0.01 sek, utan 0.55 (och skillnaden lär öka ju fler inlägg som petas in förnärvarande 1.500 st) - samtidigt som databasen tar 2 meg med fulltextindex aktiverat och 1 meg utan (och om nåt år 1 gig vs 500 meg osv...))

Till the_avatar (och även andra

Man behöver inte ha fulltextindex aktiverat, det går bra att köra boolean search iaf men går bra mycket fortare när man har fulltextindexet aktiverat eftersom databasen behöver då inte söka igenom alla (tex) 500.000 inläggen utan går genom pointers till rätt rätt ställe i fulltextindexet och får ut vilka (och därmed hur många) träffar den får mot det sökkriteria du angivit vilket leder till mindre last på databasservern som i sin tur gör att hela systemet känns snabbare

Permalänk
Medlem

Tackar för svaren

mycket bra stil på det här forumet

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Apachez

Dessutom kommer sökning mot fulltextindex alltid vara snabbare än "like" sökningar när vi talar om två eller fler (kan hända även för ett sökord också men skillnaden lär öka med fler sökord) sökord på textmängder som i sin tur leder till (vid använde av index) mindre last på databasservern.

Du har nog missuppfattat mig. Jag pratar inte om att bara ignorera indexering och köra helt vanliga textsökningar med LIKE-operatorn. Jag pratar om att implementera en egen sökindexering istället för att använda den inbyggda. Följande svar fick jag på frågan varför sökningar i mitt fulltext-index var så långsamma och varför fulltextindexet inte dykte upp i nyckelkolumnen när man kör EXPLAIN:

"The 'index' just offers some extra functionality on-top of what is basically a 'LIKE' operator. It compares two strings and calculates the likeness, which you can then use to decide which records to select. But obviously the likeness depends on what you put into the 'MATCH' clause, so it cannot be pre-calculated and stored in an index they way you'd store the auto_increment value in an index. That means the database must re-calculate for every row, even if it turns out you only need one row out of 30 million.

If you have 200k records, the fulltext will calculate the likeness for all 200k rows, which will take time. In your case: 7 seconds.

This is what makes the fulltext as it is quite useless."

Citat:

Ursprungligen inskrivet av Apachez

Just stopwordlistan kommer med lite tur att petas ut som en cfg fil i kommande versioner men fördelen med att ha den förkompilerad är just att den då redan ligger inne i databasen som tack vare att mysql är opensource inte ger samma problem som tex med mssql ifall man vill ändra på något

Ok. Då förmodar jag att man kommer ha flera olika cfg-filer för olika språk då eller? Aja, det viktiga är iaf att man får möjlighet att som användare välja vilket språk det är man använder. Man kan ju faktiskt köra mer än ett språk på en server

Citat:

Ursprungligen inskrivet av Apachez

Vidare har iaf mssql 2k möjligheter till fulltextindexering utan externa plugins.

Nej, det är ett externt program som man måste köra samtidigt som SQL-servern. Sök efter "Microsoft Search Service" på den här sidan: http://stylusinc.com/website/microsoftSQL2000.htm

Citat:

Ursprungligen inskrivet av Apachez

(Det är något som jag sitter och grubblar på gällande TBGv2, en sökning med fulltextindex tar 0.01 sek, utan 0.55 (och skillnaden lär öka ju fler inlägg som petas in förnärvarande 1.500 st) - samtidigt som databasen tar 2 meg med fulltextindex aktiverat och 1 meg utan (och om nåt år 1 gig vs 500 meg osv...))

Innan du fattar beslut om huruvida du ska använda MySQL's fulltextindex eller inte bör du nog göra lite tester på ett större sökmaterial. Jag levde i uppfattningen att alla skript i mitt forum var blixtsnabba jämfört med t.ex. vbulletin. När jag väl smällde in 15000 användare, 18000 trådar och 200000 inlägg upptäckte jag snabbt att det inte riktigt var så. Framför allt var det fulltextsökningen som hade gått från supersnabb till odrägligt långsam.

Permalänk
Medlem

Tro mig... jag har gjort större tester än 1.500 inlägg gällande TBGv2, det är bara det att 1.500 inlägg är just unika - när jag har gjort egna tester har alla inläggen sett likadana ut eftersom det är lite meckigt att peta in urandom som text samtidigt som att man skall kunna få ut något vettigt ur det

Fulltext kan måhända vara långsamt under mysql 3 men det är inget jag har upptäckt sedan jag har använt den under mysql 4 (mer än det jag tidigare sagt att det tar plats).

Vidare kan det säkerligen även påverka hur queryn ser ut - i mitt fall dyker fulltext nyckeln upp i använda metoder när jag använder mig av EXPLAIN men så använder jag mig även av boolean mode (borde ju inte påverka i sig).

http://www.mysql.com/doc/en/Fulltext_Search.html

This query retrieved all the rows that contain the word MySQL (note: the 50% threshold is not used), but that do not contain the word YourSQL. Note that a boolean mode search does not auto-magically sort rows in order of decreasing relevance. You can see this from result of the preceding query, where the row with the highest relevance (the one that contains MySQL twice) is listed last, not first. A boolean full-text search can also work even without a FULLTEXT index, although it would be slow.

Lite fler sidor av intresse kring fulltext:

http://www.mysql.com/doc/en/Fulltext_Fine-tuning.html

samt

http://www.mysql.com/doc/en/Fulltext_TODO.html

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Apachez

Tro mig... jag har gjort större tester än 1.500 inlägg gällande TBGv2, det är bara det att 1.500 inlägg är just unika - när jag har gjort egna tester har alla inläggen sett likadana ut eftersom det är lite meckigt att peta in urandom som text samtidigt som att man skall kunna få ut något vettigt ur det

En klassisk lösning på det är att utnyttja en väldigt stor textmassa (the_bible.txt t.ex) och göra slumpmässiga urklipp ur den.

Citat:

Ursprungligen inskrivet av Apachez

Fulltext kan måhända vara långsamt under mysql 3 men det är inget jag har upptäckt sedan jag har använt den under mysql 4 (mer än det jag tidigare sagt att det tar plats).

Ok. Jag får väl installera 4:an och testa. Jag har dock svårt att tro att fulltext blivit tja, 10-15 gånger snabbare eller nåt sånt. Är det långsammare än så är det nämligen inte användbart.

Citat:

Ursprungligen inskrivet av Apachez

Vidare kan det säkerligen även påverka hur queryn ser ut - i mitt fall dyker fulltext nyckeln upp i använda metoder när jag använder mig av EXPLAIN men så använder jag mig även av boolean mode (borde ju inte påverka i sig).

Ok. Det kanske är så att fulltext nu faktiskt är ett riktigt index och inte bara en utökning av LIKE-operatorns funktion.

Du kan sluta anta att jag är en idiot nu.

Permalänk
Medlem

Det är den röda mössan

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Apachez
Det är den röda mössan

=D