fulltext search i MySQL.. frågor

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001

fulltext search i MySQL.. frågor

Sitter och gör en sökfunktion med fulltext search i MySQL. PHP används förövrigt på sidan.
Har dock lite problem med sökfunktionaliteten..
Fulltext searchen söker just nu endast i kategorier som består av ett ord..
t.ex.
Bilar
Båtar
Cyklar o.s.v.
Om sökordet matchar en kategori visas produkterna som finns i kategorin. Låter konstigt, men det är så det är uppbyggt och ska vara.
Dock skulle jag vilja att söken hittar produkter i kategorin båtar även om man nu bara skriver båt eller t.ex. båtintresserad .
Så är inte fallet, utan då hittas inget alls tyvärr..

Vad kan jag göra åt detta?
Att söka på exakt rätt ord är dock inga problem

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Jun 2005

Du får använda i din fråga typ:

Exempel 1: betyder matcha 'vadsomhelst+<query>'
SELECT * from tabell WHERE kategori LIKE '%<query>'

Exempel 2: betyder matcha '<query>+vadsomhelst'
SELECT * from tabell WHERE kategori LIKE '<query>%'

Exempel 3: betyder matcha 'vadsomhelst+<query>+vadsomhelst'
SELECT * from tabell WHERE kategori LIKE '%<query>%'

Hoppas det kan ge lite ljus på saken.

prova även att söka på MySQL om LIKE
http://dev.mysql.com/doc/refman/5.0/en/string-comparison-func...

Lycka till.

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001
Citat:

Ursprungligen inskrivet av BlueEyes
Du får använda i din fråga typ:

Exempel 1: betyder matcha 'vadsomhelst+<query>'
SELECT * from tabell WHERE kategori LIKE '%<query>'

Exempel 2: betyder matcha '<query>+vadsomhelst'
SELECT * from tabell WHERE kategori LIKE '<query>%'

Exempel 3: betyder matcha 'vadsomhelst+<query>+vadsomhelst'
SELECT * from tabell WHERE kategori LIKE '%<query>%'

Hoppas det kan ge lite ljus på saken.

prova även att söka på MySQL om LIKE
http://dev.mysql.com/doc/refman/5.0/en/string-comparison-func...

Lycka till.

Använder inte denna typ av sök, utan använder mig av fulltext search på MyISAM-tabellet.. och tyvärr verkar inte % fungera där.. Har redan prövat det.

Mer förslag?

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Jun 2005

Kan man få se några av frågorna du använder ?

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001
Citat:

Ursprungligen inskrivet av BlueEyes
Kan man få se några av frågorna du använder ?

Sure. Exempel:

SELECT ptabell.tabellid, ptabell.tabelltitel FROM tabell, tabell2, kopplingstabell WHERE MATCH(tabell2.tabell2namn) AGAINST('%$searchstring%') AND ptabell.tabellid = kopplingstabell.tabellid AND tabell2.tabell2id = kopplingstabell.tabell2id;

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

Du kan använda boolean mode för att få stöd för wildcards:
http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html

SELECT * FROM table WHERE MATCH (col) AGAINST ('bil*' IN BOOLEAN MODE);

Det drar nytta av fulltextindexet om ett sådant finns (men sorterar
inte efter relevans), om du söker i textstycken är det att föredra över
LIKE, men om du bara söker i en kolumn med kategorinamn är det
antagligen lika smidigt för dig med LIKE 'bil%'.

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001
Citat:

Ursprungligen inskrivet av Biberu
Du kan använda boolean mode för att få stöd för wildcards:
http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html

SELECT * FROM table WHERE MATCH (col) AGAINST ('bil*' IN BOOLEAN MODE);

Det drar nytta av fulltextindexet om ett sådant finns (men sorterar
inte efter relevans), om du söker i textstycken är det att föredra över
LIKE, men om du bara söker i en kolumn med kategorinamn är det
antagligen lika smidigt för dig med LIKE 'bil%'.

Har redan testat med BOOLEAN-mode och det hjälpte inte till något extra heller..
jo sant, söker ju (för närvarande iaf) bara i en kolumn med ett ord..

men annars, det går inte finjustera fulltext search på annat sätt annars?
alltså så det blir lite mindre känsligt typ?

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007

Biberu's svar är det rätta, utefter de beskrivningar du har givit. Det blir enklare om du visar ett exempel på en fråga, vad som finns i tabellen och vad du förväntar dig i retur.

T.ex.:
Tabellen:

id col col2 -------------------------------- 1 'mooo' '0x99' 2 'subaru' '0x01' 3 'fooo' '0x01' 4 'subdirectory' '0x28' ...

Frågan:

select col2 from mytable where match (col) against ('sub*' in boolean mode)

Bör returnera (och det gör den):

col2 ----- 0x01 0x28

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001
Citat:

Ursprungligen inskrivet av bjornie
Biberu's svar är det rätta, utefter de beskrivningar du har givit. Det blir enklare om du visar ett exempel på en fråga, vad som finns i tabellen och vad du förväntar dig i retur.

...
[/code]

Tabellen:

id namn ------------------ 1 'cykel' 2 'bil' 3 'båt' 4 'lastbil' ...

Frågan:
Om jag t.ex. ställer en fråga till databasen, exempelvis bilintresserad så vill jag att databasen ska returnera kategorin bil.
Har försökt med både en fulltextsearch och en vanlig "like "%sokord%" så som

SELECT namn from tabell WHERE namn LIKE "%sokord%"; och SELECT namn from tabell WHERE MATCH("namn") AGAINST("sokord"); har även prövat, för att få fram scoren på ett sökord: SELECT namn, MATCH("sokord") AGAINST("sokord") from tabell WHERE MATCH("sokord") AGAINST("sokord")

Jag VILL att om jag söker på t.ex. båtintresserad så ska det returnera båt från kategorierna exempelvis. Det gör den dock inte. %sokord% hjälper inte till eftersom båtintresserad är ett ord, % blir alltså verklingslöst..

Hur kan jag lösa detta?

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi