[SQL Server 2008] Fulltext index geeft niet juiste resultaat

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 08-09 15:10
Hallo,

Ik heb een tabel met artikelen. Een kolom in deze tabel heeft een fulltext index en bevat informatie zoals artikelnaam, artikelnummer, etc....

Bijvoorbeeld:
CR1AC1EM1SP10535PG5 008498 31755 008498 4015080317555 Dit is een heel mooi artikel

Het vetgedrukt nummer is het nummer waar ik op zoek mbv het ContainsTable keyword. De query ziet er alsvolgt uit:

SELECT top 10 *  FROM MyTable INNER JOIN containstable(MyTable,
ColumnProductInfo, '"4015080317555"', 1000) FTS
ON MyTable.ColumnUniqueKey = FTS.[key]


Als ik de query run dan komt ie niet alleen terug met bovenstaande artikel, maar met alle artikels waarvan het nummer begint met 401508 (de eerste 6 digits dus).

Dit probleem treedt op als de taal van de fulltext kolom op 'Neutral' of 'Dutch' staat. Wanneer ik de taal verander naar 'English' dan krijg ik wel als resultaat alleen dit artikel terug. Dit had ik echter ook verwacht als de taal op 'Neutral' of 'Dutch' staat.

Als ik de query aanpas zodat er een sterretje (*) staat in plaats van de laatste 5 uit het artikelnummer, dan werkt het wel correct, dus:

SELECT top 10 *  FROM MyTable INNER JOIN containstable(MyTable,
ColumnProductInfo, '"401508031755*"', 1000) FTS
ON MyTable.ColumnUniqueKey = FTS.[key]


Ik wil echter graag als language 'Dutch' omdat de artikelnamen voornamelijk in het Nederlands zijn. Bovendien draait de database al bij klanten en ik weet niet wat voor beerput ik open trek als ik de language ga aanpassen.

Wat gaat er verkeerd en wat kan ik doen om het op te lossen?

Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
De vraag die bij mij opkomt is of je hier wel Full-Text Search voor moet gebruiken? Wat je nu wilt is een artikel uit een artikel tabel opzoeken aan de hand van aan nummer. Waarom gebruik je hier niet gewoon de equals operator voor, of desnoods LIKE als je een wildcard nodig hebt?

Full-text Search voert namelijke een taalkundige analyse uit (linguistic analyse) en gaat niet opzoek naar alleen exacte overeenkomsten. Dat het bij Engelstalig wel goed gaat kan te maken hebben met de manier dat getallen in de Engelse taal worden geanalyseerd. Het is niet voor niets onmogelijk om een Full-Text index te definiëren op een kolom met een numeriek datatype.

edit:
De eerste alinea van MSDN (Full-Text Search Overview) beschrijft het mooi:
Full-text queries perform linguistic searches against text data in full-text indexes by operating on words and phrases based on rules of a particular language such as English or Japanese. Full-text queries can include simple words and phrases or multiple forms of a word or phrase.

[ Voor 22% gewijzigd door Razr op 01-06-2010 19:43 ]


Acties:
  • 0 Henk 'm!

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 08-09 15:10
Ik begrijp je redenatie. Echter, we zoeken niet alleen artikelen op nummer, maar ook op naam en omschrijving. Bovendien is performance een hot issue, en de ervaring heeft ons geleerd dat het zoeken middels de fulltext index serieus sneller is. Denk hierbij aan een tabel met 3.000.000+ records.

Het is aannemelijk dat getallen per taal verschillend worden geanalyseerd. Ik zal eens uitzoeken hoe de taal de zoekresultaten beinvloed bij het zoeken naar 'normale' tekst.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Het probleem is dat fulltext indexen in principe extreem traag zijn ( naast dat ze een interne methodiek hebben die niet altijd even handig is ) zolang het om numerieke velden of bekende velden gaat.
Het is geen fit for all solution die alles even oplost.

In dit specifieke geval zou ik gewoon een index zetten op artikelnr en daar een extra conditie aan hangen.
Veelal zie ik toch dat mensen of enkel op het begin ( like "4...%" met gebruik van index ) of enkel op het einde zoeken ( like "5....%" op een veld met de omgekeerde artikelnrs met gebruik van index ) als je het hebt over artikelnrs...

Ik vermoed dat je echt een grote beerput open gaat trekken als je de taal van je full-text index gaat veranderen. Dan krijg je al snel dingen als dat een klant van een klant eerst altijd iets op manier x kon vinden en nu niet meer. En jouw klant legt dat weer bij jou neer...