none
Volltextsuche: Unterschiedliches Verhalten SQL-Server 2005 zu 2008 bei Umlautsuche RRS feed

  • 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

    Dienstag, 4. Januar 2011 05:27

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 Skript

    Use 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

    Mittwoch, 19. Januar 2011 10:03

Alle Antworten

  • Hallo Stefan,

    eine wesentliche Informationen fehlt: Welchen Zeichensatz verwendet die volltextindizierte Spalte?
    Nur so könnte man das Verhalten nachvollziehen und vielleicht eine Lösung finden.

    Gruß Elmar

    Dienstag, 4. Januar 2011 08:10
    Beantworter
  • 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

    Dienstag, 4. Januar 2011 08:54
  • 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 Skript

    Use 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

    Mittwoch, 19. Januar 2011 10:03