Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MS-SQL] CONTAINSTABLE + Wildcard (*) + cijfer/letter combi

Pagina: 1
Acties:

  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
SQL 2005.

In een column entry_ARTNAME staan o.a. de volgende entries:

Sony Alpha DSLR-A700 Body
Sony DSLR-A700 body
Sony Alpha 700 body

Wanneer ik zoek middels:

code:
1
SELECT entry_ARTNAME  FROM spiderbase WHERE CONTAINS (entry_ARTNAME , ' "*son*" and "*700*" and "*body*" ' )


(met dus zowel voor als achter een * wildcard voor fulltext-search)

vind ik op

code:
1
"*son*" and "*700*" and "*body*"

Alleen Sony Alpha 700 body

code:
1
"*son*" and "*700*" and "*body*"

Alleen Sony Alpha 700 body

En op

code:
1
"*son*" and "*700*" and "*body*"

Sony Alpha DSLR-A700 Body
Sony DSLR-A700 body

Dat hij bij *A700* "Sony Alpha 700 body" niet toont snap ik daar daar geen *A700* in voorkomt. Maar ik sta voor een raadsel waarom bij *700* die:

Sony Alpha DSLR-A700 Body
Sony DSLR-A700 body

Niet gevonden worden ?

Ook als ik van *body* / *ody* maak wordt er niks meer getoont. M.a.w. het lijkt net of die wildcard erachter wel werkt maar voor de tekst niet.

[ Voor 7% gewijzigd door MrCaBLeGuY op 19-03-2008 07:18 ]


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 13:37

sopsop

[v] [;,,;] [v]

Nou weet ik niet hoe dat bij CONTAINSTABLE zit maar bij de LIKE operator wordt '%' als wildcard gebruikt.

Verder zou het volgens mij ook zonder de wildcards moeten werken. Tenminste dat haal ik uit de voorbeelden. Zo dus:
code:
1
SELECT entry_ARTNAME  FROM spiderbase WHERE CONTAINS (entry_ARTNAME , ' "son" and "700" and "body" ' )

[ Voor 56% gewijzigd door sopsop op 19-03-2008 16:24 ]


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

In de documentatie zie ik staan:
<prefix_term>
Specifies a match of words or phrases beginning with the specified text. Enclose a prefix term in double quotation marks ("") and add an asterisk (*) before the ending quotation mark, so that all text starting with the simple term specified before the asterisk is matched. The clause should be specified this way: CONTAINS (column, '"text*"'). The asterisk matches zero, one, or more characters (of the root word or words in the word or phrase). If the text and asterisk are not delimited by double quotation marks, so the predicate reads CONTAINS (column, 'text*'), full-text search considers the asterisk as a character and searches for exact matches to text*. The full-text engine will not find words with the asterisk (*) character because word breakers typically ignore such characters.
Het lijkt erop dat een * alleen achter een term mag staan, en er niet mee kan beginnen. Lijkt me technisch ook logisch, omdat een term die begint met een wildcard niet indexeerbaar is.

en ja, dit komt van de documentatie van de CONTAINS clause, maar dat maakt voor hier niet uit

[ Voor 4% gewijzigd door _Thanatos_ op 20-03-2008 04:05 ]

日本!🎌


  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
Hmmz dat maakt de fulltext index een stuk minder interessant, probleem is dat mensen kunnen zoeken op producten (als in de pricewatch, maar dan zelf zoeken) Omdat verschillende webshops verschillende notaties gebruiken zoals voorbeeld van die Alpha 700:

Ik heb nu de volgende resultaten op "Sony a700 body"

1. Sony DSLR-A700 Body
2. Sony Alpha DSLR-A700 Body
3. Sony DSLR-A700 body + € 150,- cash back!

Op "Alpha 700"

1. Sony DSLR Sony Alpha 700 Kit 18-70 mm

Oplossing slimmer zoeken, bijvoorbeeld "Sony 700" dan worden:

1. Sony DSLR-A700 Body
2. Sony Alpha DSLR-A700 Body
3. Sony DSLR-A700 body + € 150,- cash back!

Echter niet getoont omdat er voor 700 tekst staat (zoeken op A700 werkt wel tekst voor - teken is geen probleem).

Met andere woorden die PREFIX voor zowel VOOR als ACHTER de '*zoekterm*' is mega belangrijk.

Oplossing zou zijn LIKE '%700%'. Maar een LIKE op een tabel met meer dan 1,5 miljoen rows is geen succes :( Is er truc (of ms-sql add-on oid) die het mogelijk maakt in je index met CONTAINSTABLE zowel een prefix voor als achter je zoekterm te implementeren?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Ik heb nog ff gezocht, maar zou zelf ook zeggen dat je beter zelf iets in elkaar kunt bouwen of iets kunt kopen wat doet dat je wilt. Want volgens mij is full-text search eerder bedoeld voor lappen tekst, dan voor lijsten met productnamen.

In deze posting hebben ze het bijv over Sharepoint, die geheel tegen mijn verwachting in een andere fulltext engine huisvest dan SQL Server. En het lijkt erop dat je die kunt gebruiken. De vraag is alleen of je het met je huidige set data kunt gebruiken, want relationele data naar Sharepoint verhuizen lijkt me een beetje far-fetched.

日本!🎌


  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
Ik denk dat je eens naar FREETEXT zou moeten kijken.

code:
1
2
SELECT entry_ARTNAME  FROM spiderbase 
WHERE CONTAINS (entry_ARTNAME , ' "son" and "700" and "body" ' )


zou dan iets worden als
code:
1
2
SELECT entry_ARTNAME  FROM spiderbase 
WHERE FREETEXT (entry_ARTNAME , 'son 700 body' )



Sharepoint:
Voor zover ik weet maakt sharepoint gebruik van dezelfde code als de windows indexing service, omdat deze ook XLS, DOC, PDF enz enz enz moet kunnen indexeren. en dat gaat een beetje verder dat dat FTS gaat.

EDIT : Laat maar, zojuist FREETEXT getest, en het zoekt alle stukken text waarin alle woorden voorkomen, maar wederom alleen volledige woorden.

[ Voor 12% gewijzigd door Fiander op 01-04-2008 07:35 ]

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Als aanvulling op _Thanatos_:
Je zou eventueel naar lucene.net kunnen kijken. Dat bestaat uit twee delen, de eerste is een spider waarbij JIJ (de programmeur) de spider voed met data en een 'query' gedeelte welke de meeste complexe search queries aankan, boolean, keyword priority, gequote tekst, etc. Het komt dit in de buurt van de mogelijkheden van google. Je hebt alleen niet de site:, link:, etc keywords.

Lucene.net is een (directe) port van Java Lucene en is daardoor nauwelijks geoptimaliseerd voor het .NET platform, doch vind ik de performance meer dan redelijk.

If it isn't broken, fix it until it is..


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Niemand_Anders schreef op dinsdag 01 april 2008 @ 08:27:
Als aanvulling op _Thanatos_:
Je zou eventueel naar lucene.net kunnen kijken
En Sphinx, en Xapian/omega etc etc. :P
MrCaBLeGuY schreef op zaterdag 29 maart 2008 @ 21:18:
Is er truc die het mogelijk maakt in je index met CONTAINSTABLE zowel een prefix voor als achter je zoekterm te implementeren?
Als een 'truc' (aka zeer ranzige 'oplossing') ook goed is:
Een kolom met de string in reverse order en dan ook op omgedraaide worden zoeken. :+
[/ranzig]

{signature}


Verwijderd

Misschien heeft het te maken met het punt dat FULL-TEXT bepaalde woorden filtert. Waaronder dan misschien 700?

Hier wat meer info

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Misschien heeft het te maken met het punt dat FULL-TEXT bepaalde woorden filtert
Nee, dat heeft er niets mee te maken. Fulltext indexeert woorden in een tekst. WOORDEN dus. En je kunt nou eenmaal niet een index doorzoeken als je de eerste letter(s) van zo'n woord niet weet.

Analogie: ga maar es in een telefoonboek alle telefoonnummers zoeken van namen die eindigen op "len" ofzo. Success :+

日本!🎌


  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
_Thanatos_ schreef op woensdag 02 april 2008 @ 01:59:
[...]

Nee, dat heeft er niets mee te maken. Fulltext indexeert woorden in een tekst. WOORDEN dus. En je kunt nou eenmaal niet een index doorzoeken als je de eerste letter(s) van zo'n woord niet weet.

Analogie: ga maar es in een telefoonboek alle telefoonnummers zoeken van namen die eindigen op "len" ofzo. Success :+
Dat vind ik nou nog eens een mooie uitleg :) +1

Heb even gekeken bij dat lucence, het vervelende is dat ik echt geboden ben aan een MS-oplossing (ms-sql, asp/.net). Niet alleen op basis van de huidige database maar ook op basis van 'kennis' :)

Sharepoint heb ik niet direct aan gedacht, ga me eens inlezen of dat een oplossing kan zijn. Ik ga ook eens proberen wat de beta SQL 2008 er mee kan.
Pagina: 1