fulltext search i MySQL.. frågor

Permalänk
Medlem

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

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem

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.

Visa signatur

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.

Permalänk
Medlem
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?

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem

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

Visa signatur

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.

Permalänk
Medlem
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;

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Legendarisk

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%'.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem
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?

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem

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

Permalänk
Medlem
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?

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |