Benutzer mit den meisten Antworten
Volltextsuche: Unterschiedliches Verhalten SQL-Server 2005 zu 2008 bei Umlautsuche

Frage
-
Hallo,
ich habe ein Problem mit der Volltextsuche unter SQL-Server 2005 und 2008. Die Systeme verhalten sich unterschiedlich.
In der DB steht kettensaege1800
sql server 2005
ketten -> gefunden
kettensaege -> gefunden
kettensaege1800 -> gefunden
kettensäge -> nix
sql server 2008 R2
ketten -> gefunden
kettensaege -> nix
kettensaege1800 -> gefunden
kettensäge -> nix
In der DB steht kettensäge1800
sql server 2005
ketten -> gefunden
kettensäge -> gefunden
kettensäge1800 -> gefunden
kettensaege -> nix
sql server 2008 R2
ketten -> gefunden
kettensäge -> nix
kettensäge1800 -> gefunden
kettensaege -> nix
Die Indexe sind definiert als:
exec sp_fulltext_database 'enable';
---
if not exists(select * from dbo.sysfulltextcatalogs where name = 'ris')
begin
exec sp_fulltext_catalog 'ris','create';
end;
---
--- ris_mmsdata
---
if objectproperty(object_id('ris_mmsdata'), 'tablehasactivefulltextindex')=0
begin
exec sp_fulltext_table 'ris_mmsdata', 'create', 'ris', 'pk_ris_mmsdata';
end;
if columnproperty(object_id('ris_mmsdata'), 'data', 'IsFulltextIndexed')=0
begin
exec sp_fulltext_column 'ris_mmsdata', 'data', 'add', 0x0407, 'fileext';
end;
exec sp_fulltext_table 'ris_mmsdata','activate';
exec sp_fulltext_table 'ris_mmsdata', 'Start_change_tracking';
exec sp_fulltext_table 'ris_mmsdata', 'Start_background_updateindex';Was kann eingestellt werden, damit sich 2008 wie 2005 verhält?
Danke
Stefan
Antworten
-
Hallo Stefan,
ich möchte das noch mal aufgreifen, falls das Problem noch nicht gelöst ist.
Ich habe es auf Version 2005 mit SP4 (9.00.5000) getestet und kann das von Dir beschriebene Verhalten noch nicht einmal dort nachvollziehen. Testdatenbank ist mit Latin1_General_CI_AS angelegt. Hier mein SkriptUse Test go CREATE TABLE[dbo].[ris_mmsdata]( [id][int]NOT NULL, [agendaitemid][int]NOT NULL, [votingid][int]NOT NULL, [meetingid][int]NOT NULL, [committeeid][int]NOT NULL, [clientid][int]NOT NULL, [isprotected][bit]NOT NULL, [blobtype][nvarchar](255)NOT NULL, [data][varbinary](max)NOT NULL, [fileext][nvarchar](255)NOT NULL, [bereitstellungsumfangangemeldet][bit]NOT NULL, [bereitstellungsumfanggast][bit]NOT NULL, [datatype][int]NOT NULL, CONSTRAINT[PK_ris_mmsdata]PRIMARY KEY CLUSTERED ( [id]ASC ) WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY] ) ON[PRIMARY]; go exec sp_fulltext_database 'enable'; --- if not exists(select * from dbo.sysfulltextcatalogs where name = 'ris') begin exec sp_fulltext_catalog 'ris','create'; end; --- --- ris_mmsdata --- if objectproperty(object_id('ris_mmsdata'), 'tablehasactivefulltextindex')=0 begin exec sp_fulltext_table 'ris_mmsdata', 'create', 'ris', 'pk_ris_mmsdata'; end; if columnproperty(object_id('ris_mmsdata'), 'data', 'IsFulltextIndexed')=0 begin exec sp_fulltext_column 'ris_mmsdata', 'data', 'add', 0x0407, 'fileext'; end; exec sp_fulltext_table 'ris_mmsdata','activate'; exec sp_fulltext_table 'ris_mmsdata', 'Start_change_tracking'; exec sp_fulltext_table 'ris_mmsdata', 'Start_background_updateindex'; go Set Nocount on insert into dbo.ris_mmsdata(id, agendaitemid, votingid, meetingid, committeeid, clientid, isprotected, blobtype, data, fileext, bereitstellungsumfangangemeldet, bereitstellungsumfanggast, datatype) values(1,1,1,1,1,1,1,'A',convert(varbinary(max),'kettensäge 1800'),'txt',1,1,0); go select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'ketten'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'formsof(inflectional, ketten)'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'kette'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'säge'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'kettensäge'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, '"kettensäge 1800"'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'kettensaege');
"Ketten" wird nur über FORMSOF gefunden, die anderen Begriffe werden alle gefunden.
Wenn ich das Leerzeichen vor der 1800 weglasse, wird gar nichts gefunden, ausser man verwendet contains(data, '"kettensäge1800"').Einen schönen Tag noch,
Christoph
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu- Als Antwort markiert Robert BreitenhoferModerator Montag, 24. Januar 2011 15:26
Alle Antworten
-
Hallo Elmar,
Sortierung der Datenbank ist Latin1_General_CI_AS. Der Zeichensatz der Spalte ist ebenfalls Latin1_General_CI_AS.
Die Tabelle wird angelegt mit:
CREATE TABLE [dbo].[ris_mmsdata]( [id] [int] NOT NULL, [agendaitemid] [int] NOT NULL, [votingid] [int] NOT NULL, [meetingid] [int] NOT NULL, [committeeid] [int] NOT NULL, [clientid] [int] NOT NULL, [isprotected] [bit] NOT NULL, [blobtype] [nvarchar](255) NOT NULL, [data] [varbinary](max) NOT NULL, [fileext] [nvarchar](255) NOT NULL, [bereitstellungsumfangangemeldet] [bit] NOT NULL, [bereitstellungsumfanggast] [bit] NOT NULL, [datatype] [int] NOT NULL, CONSTRAINT [PK_ris_mmsdata] PRIMARY KEY CLUSTERED ([id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
Grüße
Stefan
- Bearbeitet Robert BreitenhoferModerator Montag, 24. Januar 2011 15:25 Formatierung
-
Hallo Stefan,
ich möchte das noch mal aufgreifen, falls das Problem noch nicht gelöst ist.
Ich habe es auf Version 2005 mit SP4 (9.00.5000) getestet und kann das von Dir beschriebene Verhalten noch nicht einmal dort nachvollziehen. Testdatenbank ist mit Latin1_General_CI_AS angelegt. Hier mein SkriptUse Test go CREATE TABLE[dbo].[ris_mmsdata]( [id][int]NOT NULL, [agendaitemid][int]NOT NULL, [votingid][int]NOT NULL, [meetingid][int]NOT NULL, [committeeid][int]NOT NULL, [clientid][int]NOT NULL, [isprotected][bit]NOT NULL, [blobtype][nvarchar](255)NOT NULL, [data][varbinary](max)NOT NULL, [fileext][nvarchar](255)NOT NULL, [bereitstellungsumfangangemeldet][bit]NOT NULL, [bereitstellungsumfanggast][bit]NOT NULL, [datatype][int]NOT NULL, CONSTRAINT[PK_ris_mmsdata]PRIMARY KEY CLUSTERED ( [id]ASC ) WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY] ) ON[PRIMARY]; go exec sp_fulltext_database 'enable'; --- if not exists(select * from dbo.sysfulltextcatalogs where name = 'ris') begin exec sp_fulltext_catalog 'ris','create'; end; --- --- ris_mmsdata --- if objectproperty(object_id('ris_mmsdata'), 'tablehasactivefulltextindex')=0 begin exec sp_fulltext_table 'ris_mmsdata', 'create', 'ris', 'pk_ris_mmsdata'; end; if columnproperty(object_id('ris_mmsdata'), 'data', 'IsFulltextIndexed')=0 begin exec sp_fulltext_column 'ris_mmsdata', 'data', 'add', 0x0407, 'fileext'; end; exec sp_fulltext_table 'ris_mmsdata','activate'; exec sp_fulltext_table 'ris_mmsdata', 'Start_change_tracking'; exec sp_fulltext_table 'ris_mmsdata', 'Start_background_updateindex'; go Set Nocount on insert into dbo.ris_mmsdata(id, agendaitemid, votingid, meetingid, committeeid, clientid, isprotected, blobtype, data, fileext, bereitstellungsumfangangemeldet, bereitstellungsumfanggast, datatype) values(1,1,1,1,1,1,1,'A',convert(varbinary(max),'kettensäge 1800'),'txt',1,1,0); go select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'ketten'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'formsof(inflectional, ketten)'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'kette'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'säge'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'kettensäge'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, '"kettensäge 1800"'); select id, convert(varchar(100),data) as Daten from dbo.ris_mmsdata where contains(data, 'kettensaege');
"Ketten" wird nur über FORMSOF gefunden, die anderen Begriffe werden alle gefunden.
Wenn ich das Leerzeichen vor der 1800 weglasse, wird gar nichts gefunden, ausser man verwendet contains(data, '"kettensäge1800"').Einen schönen Tag noch,
Christoph
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu- Als Antwort markiert Robert BreitenhoferModerator Montag, 24. Januar 2011 15:26