Preview only show first 10 pages with watermark. For full document please download

Visual Foxpro - Usando Full Text Index

VFP e técnicas de codificação da linguagem.

   EMBED

  • Rating

  • Date

    December 2018
  • Size

    349.4KB
  • Views

    7,548
  • Categories


Share

Transcript

Visual Fox Pro HomePage Página 1 Biblioteca Aprender Downloads Suporte Comunidade Entrar | Brasil - Visual Fox Pro Usando Full Text Index Originalmente publicado na Universal Thread Magazine http://www.UniversalThread.com/Portuguese/Magazine O manejo de grandes volumes de texto sempre é uma complicação para os sistemas e para nós, os desenvolvedores. Quando temos a necessidade de manejar campos com grandes quantidades de texto começam nossas complicações e isto se potencializa se o usuário necessita buscar uma palavra, por exemplo na primera palavra da frase, ou uma que esteja em qualquer parte da frase. Aqui é onde fazem sua aparição triunfal os produtos que permitem fazer índices sobre estes campos. Usando Full Text Index com MS SQL Server Um exemplo claro onde encontramos esta necessidade é um sistema para bibliotecas, onde tenhamos uma tabela com os dados dos livros e esta tabela tenha um campo com um breve resumo (70 palavras) do conteúdo do livro e deve existir a possibilidade de buscar uma palavra dentro desta “breve” descrição. É certo que existem instrucões para fazê-lo como o LIKE e os meta caracteres de busca, mas já tentaram alguma vez fazer uma busca de uma palavra dentro de uma tabela de 20000 registros com um campo de 2100 caracteres com um LIKE? Bem, se quiserem fazer uma busca similar à anterior e obter a resposta em tempos razoáveis vão necessitar de um índice específico, não os clássicos mas um especial, que no Microsoft SQL Server (SQL) se chama Full Text Index (FTI). Conto-lhes um teste real, em uma tabela de 2 milhões de registros que tem um campo de 75 caracteres, fazer uma busca com LIKE que retorna um registro com uma quantidade correspondente (SELECT COUNT) leva 1’ 22” (um minuto e 22 segundos) e a mesma consulta através de um FTI demora 5” na primeira vez e 3” nas subsequentes. Nada mal. Full Text Search é o serviço de indexação de texto livre de que dispõe o Windows e se pode usar para buscas em páginas HTML entre outras tantas coisas. Este serviço está integrado ao Microsoft SQL Server 2000 (é instalado junto com o servidor da base de dados) e com Microsoft SQL Server 7.0 (mas há que solicitar a instalação, posto que não está selecionada por default). Este mesmo serviço é o que resolve nosso problema. Figura 1: Componentes do SQL Server (extraído do Book OnLine do Microsfot SQL Server) Quando instalarem FTI verão dentro do SQL Service Manager (ícone que fica no Tray Icon) um item (no combo de serviços) correspondente ao Microsoft Search. Aí poderão ver que este serviço funciona num processo separado do SQL e que pode ser inciado ou encerrado separadamente. Ou seja, o FTI estará START ou STOP mas desde que o SQL esteja START. Da mesma forma que o SQL, podemos setar para que o serviço de FTI se inicie ao ligar a máquina. Como mencionado o serviço funciona em separado, como também o manejo de índices (se bem que esteja muito integrado). Isto implica que quando quiserem usar um índice de FTI devem habilitá-lo a partir de uma opção especial. Cada tabela de uma base de dados poderá ter um arquivo de FTI relacionado, podendo ter dentro deste índice, um ou mais campos indexados. A este índice denominamos CATALOGO. A diferença de um índice comum de SQL, ao finalizar a criação de um catálogo este não está pronto para ser usado mas deve ser populado. Este é um proceso que se dispara separadamente e que faz com que o índice se carregue com o conteúdo correspondente. Vejamos um exemplo simples: neste caso vamos criar um catálogo dentro da base de dados PUBS que vem com SQL, para a tabela TITLES. Figura 2: Criando um catálogo dentro de uma base de dados http://msdn.microsoft.com/pt-br/library/cc564872.aspx 9/28/2010 2:34:37 PM Página 2 A partir do Enterprise Manager, fazemos click com o botão direito sobre a tabela e selecionamos Full-Text Index Table e dentro desta opção Define Full-Text Indexing on a Table... que é a única habilitada. Isto nos abrirá um Wizard para criar o catálogo. Os passos são: 1. Selecionar o índice de unicidade (Unique index). 2. Selecionar os campos a indexar. Neste exemplo o campo TITLE. 3. Selecionar o nome físico do arquivo que conterá o catálogo e seu caminho. No caso do exemplo a escolha será a default e o nome do catalogo TITULOS. 4. Logo nos é oferecido criar uma tarefa programada (Schedule Task) para popular o catálogo, que em nosso exemplo omitiremos para realizar a geração do catálogo manualmente. 5. Finalmente confirmamos a criação do catálogo. Bem, a partir destes passos teremos o catálogo criado porém vazio, como etapa seguinte popularemos o catálogo. A partir do Enterprise Manager, fazemos click com o botão direito sobre a tabela e selecionamos Full-Text Index Table e dentro desta opção Start Full Population isto nos retornará uma janela indicando que o processo se iniciou. Figura 3: Populando um catálogo Como disse antes, isto ocorre em um processo separado pelo qual não receberemos aviso sobre quando termina o processo. Neste caso, por ser uma tabela pequena (por default traz 18 registros) o tempo gasto em popular será muito pequeno, porém em tabelas grandes os tempos aumentarão exponencialmente. Para saber o estado deste processo, podemos fazer click na pasta de catálogos de Full-Text (Full-Text Catalogs) da base de dados PUBS. Aí veremos que existe um registro do catálogo recém criado e se olharmos na coluna correspondente a estado (Status) veremos “Idle” quando houver terminado o processo ou “Population in Progress” durante o processo. Finalmente faremos um teste sobre o Query Analizer aonde escreveremos select * from titles where contains(*, 'silicon') veremos que retorna os registros correspondentes a dois livros em cujos títulos figura a palavra Silicon. Visual Fox Pro Página 3 Aqui finalizo a introducão do uso de Full Text Index, vimos uma explicação sumária dos componentes e vimos como criar, popular e usar um índice de texto. A continuação explicará como utilizar isto dentro do mundo real dos sistemas, administração avançada dos índices de FTI e os prós e os contras deste sistema de trabalho. NOTA: Durante meus anos de trabalho com FoxPro tive que resolver este tema com DBFs e o fiz com um produto chamado PHDBASE que lamentavelmente foi deixado de comercializar. Digo lamentavelmente porque é um produto que trabalha muito bem com DBF e o uso é quase transparente. Somente devemos agregar o manejo desta biblioteca e aprendermos uns predicados simples e poderemos indexar campos MEMO. Atualmente existem outros produtos que fazem este trabalho sobre DBFs, mas não posso dar referencias posto que não trabalhei com eles. Usando Full Text Index na vida real Se bem que o exemplo anterior seja completamente real, não seria um caso no qual fosse imprescindível o uso do FTI, posto que uma busca usando LIKE nos responderia com eficácia a consulta (não com eficiência, mas com eficácia), mas se tivermos tabelas com muitos registros e campos mais variados o uso se faz imprescindível. Antes de nos aprofundarmos no uso de FTI, seria bom comentar as recomendações da Microsoft sobre o uso deste serviço. Microsoft recomenda manter os arquivos físicos de catálogos em outro disco distinto do que tem a base de dados. Também recomenda que as tabelas não superem o milhão de registros. Além disso recomenda máquinas potentíssimas com muita RAM, muitos processadores e muito disco. Cumprindo estas recomendações o FTI voa, agora nem todas as instalações têm equipamentos tão bem dimensionados, porém lhes asseguro que com máquinas normais (para o que se necessita como servidor) os resultados são realmente excelentes. Aprofundando no uso de FTI O manejo dos catálogos pode ser feito a partir do Enterprise Manager (ver o exemplo anterior) bem como a partir do Query Analizer. Como vimos no exemplo o primeiro passo para gerar um catálogo foi s criação do mesmo. Fizemo-lo a partir do Enterprise Manager, fizemos click com o botão direito sobre a tabela e selecionamos Full-Text Index Table e dentro desta a opção Define Full-Text Indexing on a Table... e seguimos o Wizard. Para realizar a mesma operacão a partir do Query Analizer na base de dados que queiramos indexar (PUBS para o exemplo) faremos: -- Habilitar a Base de dados para trabalhar com FTI sp_fulltext_database N'enable' -- Com esta instrução obteremos o estado da base de dados com respeito a FTI. select DATABASEPROPERTY(DB_NAME(), N'IsFullTextEnabled') -- 0 => desabilitada e 1=> habilitada para FTI. -- Com a invocação a esta Store Procedure, criaremos o catálogo chamado TITULOS . exec sp_fulltext_catalog N'TITULOS', N'create' -- Com a invocação a esta Store Procedure, selecionamos a chave única sp_fulltext_table N'[dbo].[titles]', N'create', N'TITULOS', N'UPKCL_titleidind' -- É imprescindível ter uma chave única. -- Com a invocação desta Store Procedure, selecionamos o campo a indexar e o idioma . sp _ fulltext _ column N ' [ dbo ] . [ titles - - O valor 3082 espanhol - - para - - Finalmente sp _ fulltext ingles => americano com _ table a ] ' , moderno ( 0 x 0409 ) invocação a N ' [ dbo ] . [ titles N ' title ' , ( 0x0c 0a) , ou esta ] ' , 2057 Store para N ' add ' , pode - se ingles Procedure N ' activate da , 3082 usar outros como Inglaterra ativaremos 0 para ( 0 x 0809 ) , o catálogo neutro etc ou 1033 . . ' O passo seguinte será popular o catálogo -- com a invocação desta Store Procedure, iniciaremos a população do catálogo. sp_fulltext_catalog N'TITULOS', N’start_full’ Com esta instrucão poderemos saber o estado em que se encontra o catálogo. Select FullTextCatalogProperty(N’TITULOS’, N 'PopulateStatus') -- Que nos retorna 0 => se está Idle e 1=> se o processo está em curso, entre outros valores. Populando catálogos No exemplo anterior vimos, tanto no que realizamos pelo Enterprise Manager quanto o iniciado a partir do Query Analizer, fizemos um Full Population e ignoramos a opção de Incremental Population, assim sendo porque a primera vez que populamos um catálogo é a mesma coisa pedir um processo completo (Full Population) que é chamado incremental dele mesmo (Incremental Population). A finalidade precípua da opção incremental é que ir agregando registros à tabela faça também com que estes se vejam refletidos no catálogo (recordem-se de que FTI trabalha separadamente do motor da base de dados e o ato de agregar registros à tabela não implica que os mesmos estejam no catálogo de FTI). A geração incremental de um catálogo, só funciona com os registros agregados a uma tabela se a mesma possui um campo Timestamp, e este é usado internamente para que o motor saiba que registros deva agregar. Se este campo não estiver presente a geração será total mesmo pedindo uma geração incremental. Instrucões de T-SQL para FTI http://msdn.microsoft.com/pt-br/library/cc564872.aspx 9/28/2010 2:34:37 PM Visual Fox Pro Página 4 As principais instruções (na realidade são predicados, posto que normalmente os usamos como parte de um SELECT) para realizar buscas em um catálogo de FTI são: Instrução Uso CONTAINS É utilizado para buscar em colunas com dados tipo texto que tenham coincidências exatas ou aproximadas, com palavras exatas ou com certa aproximação. Pode-se buscar uma palavra, uma frase, o prefixo de uma palavra ou uma frase, uma palavra próxima de outra, etc. FREETEXT É utilizado para buscar em colunas com dados tipo texto que coincidam com o significado e não literalmente com o conteúdo. As consultas realizadas com FREETEXT têm menos precisão que as realizadas com CONTAINS. CONTAINSTABL E Devolve uma tabela com uma ou mais linhas para aquelas colunas que contenham dados de tipo caracter nas que haja coincidências exatas ou aproximadas com palavras simples ou frases, palavras próximas a outra dada (dentro de uma certa distancia), etc. FREETEXTTABLE Devolve uma tabela com uma ou várias linhas cujas colunas contenham dados de tipo caracter cujos valores coincidam com o significado, ainda que não literalmente, com o texto especificado. Lista de palavras comuns Em todo catálogo existem palavras comuns que são desejáveis que não sejam indexadas. SQL traz um arquivo por idioma (NOISE.ESN, NOISE.ENG, NOISE.ENU, etc.) com uma lista de palavras comuns que está no diretório MSSQL\FTData\SQLServer\Config. Estes arquivos podem ser modificados e serão considerados no momento da populacão do catálogo. Se realizarmos ums busca incluindo somente uma palavra incluída no dito arquivo SQL nos responderá com uma mensagem de “somente palavras ignoradas” (A clause of the query contained only ignored words). Recomendações de uso Microsoft recomenda não superar um milhão de registros por tabela, minha experiência é que com dois milhões funciona muito bem, inclusive com 4 milhões também, mas há que considerar que os tempos de população serão altos. Bem, o que acontece quando temos tabelas com quantidade maior de registros? No meu caso já tive que fazer sistemas com manejo de 20 milhões de registros e conheço casos que tinham que manejar 50 milhões de registros. A solução será dividir a tabela horizontalmente em várias tabelas e fazer buscas paralelas. Isto sobretudo é fundamental se se trabalha sobre um SQL 7.0 posto que se mandamos popular um catálogo com maior número de colunas o processo nunca finaliza. Isto na versão 2000 está solucionado, mas o tempo que demora em popular um catálogo de 2 milhões de registros é de umas 6 horas em uma máquina com 2 processadores, 1024 Mb de RAM e discos SCSI e de umas 14 horas em uma máquina com 1 processador, 512 RAM e discos IDE. Foi realizado um teste para popular uma tabela de 15 milhões de registros (com SQL 2000) e demorou 54 horas. Conclusão Se alguma vez necessitar trabalhar com indexação de grandes volumes de texto sobre tabelas de SQL Server, você disporá de uma ferramenta realmente poderosa. Full Text Index responde de maneira espetacular nas consultas complicadas e é suficientemente versátil para trabalhar em máquinas não tão potentes. A única precaução a temer é quando dispomos de grande quantidade de registros. Deverá dispor de um tempo inicial alto e talvez deva pensar em particionar suas tabelas horizontalmente para obter excelentes resultados. Oscar Zárate é formado em Administração de Empresas e Análise de Sistemas. Trabalha como desenvolvedor desde 1987, passando pelas primeiras versões de FoxBase e Clipper até as atuais versões de Visual FoxPro, como também tem trabalhado com Visual Basic, ASP, XML, SQL Server entre outras ferramentas. Atualmente trabalha como líder de projetos na empresa Nosis SA da Argentina. Pode-se contatá-lo em [email protected]. Faça o download deste documento: Usando Full Text Index formato Word, 105 KB Inicio da pagina © 2010 Microsoft Corporation. Todos os direitos reservados. Termos de Uso | Marcas Comerciais | Política de Privacidade | Comentários http://msdn.microsoft.com/pt-br/library/cc564872.aspx 9/28/2010 2:34:37 PM