Avatar billede rbl Praktikant
21. december 2009 - 23:27 Der er 10 kommentarer og
1 løsning

Full text search

Hejsa

Jeg har lidt problemer med Full text search. Jeg ved ikke om Full text search er mangelfuld, eller om det bare er mig, der ikke kan finde noget dokumentation om dette problem.

Jeg skal bruge et søgefelt på min side, så man kan søge produkter frem. Dertil bruger jeg FREETEXT, f.eks.:

select * from products where Freetext(Products.*, 'røde frugter')

Problemet er så, at den returnerer alle rækker, hvor der enten står "røde" ELLER "frugter" i de kolonner, der er indexeret. Jeg vil kun have returneret de rækker hvor ALLE ord er til stede.
Hvordan gør man det?


Alternativt har jeg prøvet at bruge ranking med FREETEXTTABLE, så de mest brugbare resultater i det mindste står øverst, f.eks.:

select * from products
INNER JOIN FREETEXTTABLE(products, ProductName, 'røde frugter') AS KEY_TBL
ON products.Id= KEY_TBL.[KEY];
order by rank desc

Men problemet er her, at man kun kan definere én kolonne at søge i, så det giver ikke det korrekte resultat

Nogen der kan hjælpe?
Jeg vil helst have en løsning på det første problem, men hvis det bare ikke kan lade sig gøre, så i det mindste en løsning på det andet problem.

På forhånd tak

PS.
Jeg har selv tænkt på at lave en kolonne, hvor jeg samler samlige felter i en stor tekststreng, putter den i et felt for sig selv, og indexerer på kolonne. Men det vil spilde en masse plads, så det vil jeg helst undgå.
Avatar billede pi-hus Nybegynder
21. december 2009 - 23:37 #1
Prøv en af de her muligheder...


Brug CONTAINS i stedet for. Så kan "AND" bruges i søgestrengen.

SELECT * FROM products
WHERE CONTAINS(Products.*, 'røde AND frugter')


Lav det som to seperate betingelser

SELECT * FROM products
WHERE CONTAINS(Products.*, 'røde')
AND CONTAINS(Products.*, 'frugter')
Avatar billede rbl Praktikant
22. december 2009 - 00:29 #2
Ok, dit første forslag vil jeg prøve i morgen. Der kan jeg bare erstatte alle mellemrum med " AND " inden jeg sender søgestrengen ind i den stored procedure.

Dit andet forslag er jeg ikke sikker på kan lade sig gøre, da jeg ikke kender antallet af søgeord.
Avatar billede janus_007 Nybegynder
22. december 2009 - 00:43 #3
Vil du gerne finde resultater med eks.vis 'Søde nissepiger med røde æblekinder der tilbereder syrlige frugter til andestegen' ?

For så skal du nemlig bruge AND :) Ellers skal du sætte røde frugter i anførsel.. '"røde frugter"'

En anden mulighed er proximity... altså CONTAINSTABLE '"røde" NEAR "frugter"' og så tage de øverste :)
Avatar billede terry Ekspert
22. december 2009 - 09:02 #4
http://msdn.microsoft.com/en-us/library/ms142571.aspx

>>>> "Before full-text queries can be run on a given table, the database administrator must create a full-text index on the table."
Avatar billede janus_007 Nybegynder
22. december 2009 - 12:39 #5
">>>> "Before full-text queries can be run on a given table, the database administrator must create a full-text index on the table." "

*LOL* Surprise :)
Avatar billede terry Ekspert
22. december 2009 - 13:00 #6
not sure I understand your surprise there Janus
Avatar billede janus_007 Nybegynder
22. december 2009 - 16:19 #7
Terry -> It's very peculiar that a FTI is required before full text queries can be executed :)

I bet the previous sentence sounded like 'You need a database, before you can create a full text index...'
Avatar billede rbl Praktikant
22. december 2009 - 20:22 #8
Hehe, det kunne godt tyde på, at Terry ikke har læst spørgsmålet :-)

Janus 007 -> Det med CONTAINSTABLE løser jo ikke rigtig problemet med at den kun kigger i den ene kolonne. Og hvad hvis der er flere søgeord, kan man så bare skrive "NEAR" mellem dem alle?

Hmm, i dag da jeg testede FREETEXT og CONTAINS, kunne jeg ikke længere skrive Products.*
Der kunne jeg også lige pludselig kun vælge én kolonne. Jeg er helt sikker på, at det virkede i går... hmmm... mystisk. Ved I hvad årsagen kan være til det? Jeg har godt nok tilføjet og fjernet nogle kolonner til indexet, men de valgte kolonner nu er de samme som da jeg testede det i går.

Ang.:
SELECT * FROM products
WHERE CONTAINS(Products.*, 'røde AND frugter')

Den ser ud til at virke, bortset fra, at jeg ikke kan skrive Products.* mere. Fejlen er:

"Full-text table or indexed view has more than one LCID among its full-text indexed columns".

Hvad kan det være?
Avatar billede terry Ekspert
22. december 2009 - 20:42 #9
yes it seems so :o)
Avatar billede rbl Praktikant
30. december 2009 - 14:43 #10
Hmm, nu har jeg kæmpet med det her i et stykke tid, og pi-hus'es løsning er nok det tætteste jeg kommer, så tak for det.

Til gengæld har jeg lige fundet ud af, at det webhotel jeg bruger (surftown) slet ikke tillader brugen af Full Text Indexing... så det har egentlig været spild af tid.......
Avatar billede pi-hus Nybegynder
30. december 2009 - 15:05 #11
Det var da lidt øv.
Så må du finde dig et andet webhotel....

Tak for pointene, og godt nytår!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester