Problema com SQL Server 2000 full-text search (FTS) accent sensitive

For english, see here.

Ontem perdi um belo tempo tentando resolver um problema que não me era estranho, mas não me lembrava. Depois de muito tempo queimando neurônios, um estalo me fez lembrar de tudo. Desta vez vou blogar para não esquecer mais e para registrar para os leitores (e usuários do Google) a solução, bastante estranha, mas eficaz.

Quem me deu a dica na época foi um brasileiro, em alguma lista de discussão (se bobear na própria CF-Brasil), mas agora não consigo me lembrar de quem (caramba, estou precisando tomar fosfosól). Ele merecia os créditos, por isso se você souber quem foi, me avise.

O SQL Server 2000 (assim como outros bancos de dados mais parrudos) oferecem um interessante recurso chamado Full-text search (também chamado de “fulltext”, ou simplesmente FTS). As buscas do tipo full-text são mais rápidas (especialmente em tabelas grandes) e mais inteligentes que as feitas usando o bom e velho comando SQL LIKE. Entretanto no SQL Server 2000 existe um bug (não necessariamente do SQL Server, mas de um componente dele, veja abaixo) que não permite se realizar buscas full-text que sejam accent insensitive (que não diferencia palavras acentuadas das não acentuadas), mesmo se o seu collation do seu banco, tabela ou coluna seja explicitamente configurado como AI_CI (accent insensitive e case insensitive).

O problema parece estar no Microsoft Search Service, responsável pelas buscas do tipo full-text search para o SQL Server 2000. O SQL Server 2000 SP3a vêm com uma versão do Microsoft Search que não realiza buscas do tipo accent-insensitive, ou seja, ele diferencia palavras de acordo com sua acentuação, dificultando bastante a busca, uma vez que as ocorrências de, por exemplo, “Fábio”, serão diferentes das de “Fabio” (sem acento). A versão do mssearch.exe (responsável pelos processos de indexação e busca) que vem com o SQLServer 2000 é a 9.107.x.x.

Ao que parece, outros produtos da Microsoft também utilizam o Microsoft Search, porém com versões mais atualizadas, que suportam buscas accent insensitive, justamente o que precisava. O porquê da Microsoft não ter incluido esta(s) versão(ões) mais atualizada(s) no SP3 do SQL Server 2000 é um mistério para mim, porque na época do lançamento deste service pack certamente já existiam versões mais atualizadas. Talvez o diáologo abaixo, encontrado num transcript deste WebCast e um trecho deste artigo expliquem:

No Webcast:

Otto: Is there any way to have accent insensitive searches? Currently I have to preprocess the search to normalize foreign-accented characters.

Rashid: As far as I know, this has not changed on SP3. I remember reading a question that another customer submitted earlier and, as far as I know, it has not changed as part of SP3, but I think you can now do it on SP3. That will definitely be something that we could follow up and get a definite answer to because I cannot be 100 percent for sure right now.

Follow-up answer: This issue was not fixed in Service Pack 3.

No artigo:

T-SQL improvements–Look for thesaurus support as well as a full-text index creation syntax very similar to the CREATE INDEX syntax used for tables. You may realize that the current versions of Search SQL don’t handle noise words or accents well. Happily, the version of Search SQL that ships in SQL 2005 solves these problems. You can also selectively query one or more columns in your full-text query.

Ou seja, teríamos que esperar o Yukon (SQL Server 2005) para corrigir o problema… Nada disso!

Eis que para salvar nossa pele, existe o Microsoft SharePoint Portal Server 2001 (nem existe mais à venda). Este software de servidor é um destes que tem uma versão atualizada do tal Microsoft Search Service. Nele encontramos a versão 10.145.x.x, que resolve o problema das buscas accent-sensitive. A solução portanto é extrair o Microsoft Search do SharePoint e usá-la. Para isso basta seguir estas instruções. Mas como encontrar o SharePoint Portal Server 2001?

Bem, neste caso tive que fazer uma coisa muito feia, mas bastante comum em terra-brasilis (continue lendo). Como eu sou um cara estressado, e fico com pulga atrás da orelha por não saber registrar dlls e entradas no registry corretamente, resolvi instalar e logo em seguida desinstalar o SharePoint Portal Server 2001 que, confesso, consegui baixar de um site piratão, destes onde se lê “appz” e se reza para não pegar nenhum vírus ao se navegar. Afinal de contas, o que eu preciso não é o SharePoint Server, mas sim a versão atualizada (“corrigida” seria o termo mais adequado) do Microsoft Search, que é gratuíto e parte integrante do SQL Server 2000 Standard, do qual tenho licença (sei que tem gente que não vai acreditar, mas quem me conhece sabe que eu tenho sim). Mesmo assim, vale lembrar que o SharePoint Portal Server 2001, apesar de antigo, existe em versão trial, limitada a 120 dias, mas que atualiza o Microsoft Search de qualquer maneira, mesmo que você desinstale o dito cujo por completo. Eu tinha este CD (que veio num daqueles pacotes MSDN) e poderia tê-lo usado perfeitamente (e legalmente), mas infelizmente joguei fora.

Ao instalar e desinstalar o MS SharePoint Server 2001, seja a versão full ou a trial, o Microsoft Search continua atualizado na 10.145.x.x (ele não retorna à versão antiga) e as buscas do tipo fulltext são agora accent-insensitive. Wonderfull. Nada que uma boa “”reengenharia”” chinfrim não resolva.

Fica aí a dica para os mais desesperados, como eu. 😉

UPDATE: o trial do SharePoint Server 2003 também oferece a versão atualizada do Microsoft Search e pode ser baixado aqui.


5 Comments on “Problema com SQL Server 2000 full-text search (FTS) accent sensitive”

  1. SIdnei disse:

    Ótima dica. Eu já estava enlouquecendo por causa deste problema.

  2. SIdnei disse:

    Meu SQL Server 2000 está instalado em um Windows server 2003 e, não querendo duvidar de você, resolvi testar. Realmente não funcionou.
    Qual o macete para o Win2003?

  3. Alex Hubner disse:

    O macete para rodar o Windows 2003 com SQL Server 2000 e ter buscas full-text case-insensitive consiste em sobrescrever o MSSearch que vêm no Service Pack 4 com o existente no SharePoint Portal Server 2001 (não vai funcionar com o 2003). Eu fiz sem marcar os passos, mas as instruções básicas são:

    1) Baixe a versão trial e full do SharePoint Portal Server 2001 –
    http://www.microsoft.com/downloads/details.aspx?FamilyID=ea4687d0-b473-4db5-af81-f51c8e485901&displaylang=en – e rode o executável extraindo os arquivos para uma pasta qualquer (ex: C:SharePointPortalServer). Não dê prosseguimento à instalação do software;

    2) Baixe os arquivos que compõe o SQL Server 2000 Service Pack 4 – http://www.microsoft.com/downloads/details.aspx?familyid=8E2DFC8D-C20E-4446-99A9-B7F0213F8BC5&displaylang=en – e rode o executável extraindo os arquivos para uma pasta qualquer (ex: C:SQL2KSP4);

    3) Da pasta onde foi extraido os arquivos do SharePoint, copie a pasta “ServerSearch” e sobrescreva todos os arquivos em cima da pasta “x86fulltextmssearchsearch” no local onde os arquivos do SP4 foi extraído;

    4) Aplique o SP4 usando a base de arquivos alterada, o MSSearch será atualizado usando a mesma versão que vêm com o SharePoint Server, que é case-insensitive.

    IMPORTANTE: eu desconheço qualquer implicação legal, de licenciamento e/ou de suporte ao se usar esta solução.

    DICA: este artigo no Microsoft KB pode ajudar no processo – How to manually reinstall the Microsoft Search service for an instance of SQL Server 2000 – http://support.microsoft.com/Default.aspx?kbid=827449

    Boa sorte. Qualquer coisa escreva.

  4. Sidnei disse:

    Funcionou! Valeu!

  5. luiz Cabral disse:

    Estou tentando instalar um client mais é o segundo micro que diz ter um programa pendente na instalação como resolver essa parada podes me ajudar