segunda-feira, 15 de fevereiro de 2010

Search engines

Recentemente foram analisados alguns produtos existentes no mercado, que permitem a indexação das várias páginas de uma aplicação Web. Isto permite uma pesquisa muito rápida e eficaz. Em seguida explico os produtos analisados, e o porquê da nossa preferência pelo da IBM em parceria com a Yahoo!:


Microsoft Search Server 2008 Express Edition:

  • Uma das grandes vantagens deste produto é o facto se ser grátis, porém a sua instalação pode causar alguns problemas em máquinas que já se encontrem a correr sites com o Windows Sharepoint Service, visto que para que este produto funcione é instalada a versão 3.0 do WSS. Este produto foi instalado numa máquina nossa e o grande problema com que nos deparámos após a instalação, foi o facto de este consumir muitos recursos e de, devido a este facto, afectar muito a performance do servidor.

Google – vários:

  • Foram analisados vários produtos disponibilizados pela Google, porém nenhum deles tem uma distribuição grátis, sendo que alguns chegam a atingir mesmo preços muito elevados. Outra desvantagem é que o produto mais barato precisa ainda que seja instalado um componente de hardware no servidor.


IBM OmniFind Yahoo! Edition, por fim foi descoberto este produto, que nos parece o mais apropriado. Este tem várias vantagens, entre as quais:

  • Tem uma distribuição gratuita que se encontra limitada à indexação de 50.000 documentos (nos testes locais que fiz só foi preciso indexar 797 documentos, que ocuparam 60MB em disco), logo isto não levanta problemas para o nosso caso);
  • Processo de instalação muito simples e intuitivo, não tem nenhum requisito a não ser o facto de correr sobre a JVM (Java Virtual Machine);
  • Corre tanto em sistemas Linux como Windows;
  • Pode indexar tanto páginas Web como ficheiros da máquina;
  • É possível adicionar sinónimos às pesquisas, para assim tentar evitar as pesquisas que não retornam resultados. Por exemplo adicionar “foto, fotografia” ou “computador, pc, personal computer” como sinónimos, como se pode ver na imagem abaixo:
  • É possível consultar quais as pesquisas mais populares, quais as possíveis mais populares que não retornaram resultados, qual o link mais clicado dos retornados por uma determinada pesquisa, quais as pesquisas das quais resultaram mais clicks em links, etc;


  • É possível indicar links de destaques para certas pesquisas. Por exemplo se tivermos um conjunto de produtos que consiste num computador capacete e uma bicicleta, é possível especificar que se um cliente pesquisar por “capacete” ou por “bicicleta” o link para este conjunto será o primeiro a ser apresentado e é apresentado de forma a destacar-se dos outros (através de um tipo de letra com uma fonte maior, e estando dentro de um rectângulo a tracejado);

  • A página de busca e de resultados pode ser customizada, adicionando logótipos, imagem ou cores de fundo, e ainda definindo os estilos de letra.

Para além de tudo o que foi descrito acima, é ainda possível utilizar a API do OmniFind para efectuar as pesquisas através de pedidos http, e recebendo a resposta em formato Atom 1.0 (http://atompub.org/rfc4287.html) ou em html, sendo depois esse html integrado numa página Web já existente.

segunda-feira, 21 de dezembro de 2009

Aplicação FindAndReplace

Devido a problemas de Acessibilidade Web encontrados num projecto recente desenvolvido em tecnologia Sharepoint, decidiu-se construir uma pequena aplicação com o objectivo de automatizar a localização e substituição de tags html obsoletas de acordo com as normas de acessibilidade a cumprir.

Estes atributos são gerados pelo Sharepoint, aquando a inserção/edição de conteúdos em controlos do tipo RichHtmlField.



Com este controlo, o utilizador tem a possibilidade de formatar o conteúdo que insere e, após a publicação da página, o html que é gerado pelo Sharepoint nem sempre cumpre as normas de acessibilidade estabelecidas pelo W3C, entidade que define as directivas para a acessibilidade do conteúdo da Web.

Neste caso específico, poderíamos, por exemplo, pesquisar num site (e nos seus sites “filhos”) de acordo com o URL que o utilizador indicar e substituir os parâmetros indicados em Localizar pelos de Substituir, como é ilustrado na imagem seguinte.




/******************************Abrir o site indicado no campo URL*******************************/

using (SPSite site = new SPSite(tbUrl.Text))
{
SPWeb web = null;
try
{
SPContext context = SPContext.GetContext(site.RootWeb);
SPSecurity.RunWithElevatedPrivileges(delegate()
{
web = context.Site.OpenWeb(tbUrl.Text);
});
Localizar(web);

}
finally
{
if (web != null)
web.Dispose();
}


/***********************Localizar o que está indicado no campo Localizar*********************/
private void Localizar(SPWeb web)
{
try
{
SPQuery query = new SPQuery();
//Pesquisa no Field CorpoArtigoGenerico substituindo os caracteres <> pelo seu valor hexadecimal
query.Query = "<Where><And><Contains><FieldRef Name='CorpoArtigoGenerico' /><Value Type='HTML'>" + tbLocalizar.Text.Replace("<", "&#60;").Replace(">", "&#62;") + @"</Value></Contains><IsNotNull><FieldRef Name='TituloArtigoGenerico'/></IsNotNull></And></Where>";
SPListItemCollection listItem = web.Lists["Páginas"].GetItems(query);
if (listItem.Count != 0)
{
Substituir(listItem, web);
}
//se nao retornar resultados ou não tiver encontrado paginas do tipo artigos genericos
else
{
MessageBox.Show("No site " + web.ToString() + " não foi encontrado o termo pesquisado");
}
}
catch
{
MessageBox.Show("Erro");
}

//para cada site filho vai ser feita a pesquisa e substituiçao
for (int i = 0; i < web.Webs.Count; ++i)
{
Localizar(web.Webs[i]);
}

}


Para essa substituição acontecer, são percorridos os passos normais de uma edição de página em Sharepoint: a saída da página, a entrada da página e a publicação da mesma.

/***Editar a página, substituir pelo termo indicado no campo Substituir e Publicar a página******/

private void Substituir(SPListItemCollection listItem, SPWeb web)
{

foreach (SPListItem li in listItem)
{
if (PublishingPage.IsPublishingPage(li))
{
PublishingPage page = PublishingPage.GetPublishingPage(li);
try
{
page.ListItem.File.CheckOut();
string corpoAntigo = page.ListItem["CorpoArtigoGenerico"].ToString();
string corpoNovo = corpoAntigo.Replace(tbLocalizar.Text, tbSubstituir.Text);
//faz a substituiçao do texto antigo pelo novo
page.ListItem["CorpoArtigoGenerico"] = corpoNovo;
//faz o update, checkin, publish e aprove da pagina
page.Update();
page.ListItem.File.CheckIn("Actualizado pela Aplicacao Find&Replace");
page.ListItem.File.Publish("Publicado pela Aplicacao Find&Replace");
page.ListItem.File.Approve("Aprovado pela Aplicacao Find&Replace");
}
catch
{
MessageBox.Show("Houve um problema na saida do ficheiro");
}

}
}
MessageBox.Show("No site " + web.ToString() + " foram feitas alteraçoes");
}


Mais uma vez, dando como exemplo este caso, estas substituições estavam restritas a campos específicos de determinados esquemas de página. Por exemplo, a pesquisa seria feita para encontrar/substituir os parâmetros em causa apenas no campo Descrição do esquema de página Artigo.

Em suma, esta aplicação está construída com um objectivo muito específico mas pode servir como base para uma ideia com os mesmos propósitos.