Quando um site começa a crescer , torna-se necessário um sistema de procura . Você pode instalar vários daqueles produtos de terceiros , os chamados "search engines" , ou criar um desnecessário banco de dados e perder horas com rotinas para fazer isso , ou pode utilizar o Index Server que vem juntamente com o IIS , que pode realizar esse serviço para você , e até mesmo para outros tipo de procura de documentos .
Mas o que é Index Server ? Na documentação on-line da Microsoft , é definido de maneira direta :
Indexing Service is a Microsoft® Windows® 2000 service that indexes files on your disks and their properties as well as your Internet Information Services (IIS) Web files and properties. Indexing Service stores the resulting information in catalogs that you can efficiently search using a variety of queries.
Isto é :
O Indexing Service é um serviço do Microsoft® Windows® 2000 que organiza arquivos nos seus discos , assim como seus aquivos Web do Internet Information Services (IIS) e propriedades . O Indexing Service guarda o resultado da informação em catálogos para que você possa procurar de forma eficiente usando uma variedade de solicitações .
O Index Server permite que você execute "Queries" (Solicitações) para o servidor utilizando ADO e OLE DB . Isso permite o uso e a flexibilidade de maneira a facilitar a procura de algum arquivo .
O Objeto Index Server
O Index Server é criado como qualquer outro objeto COM do seu servidor :
dim ixQuery ' O Obejto query do Index Server .
set ixQuery = Server.CreateObject("ixsso.Query")
Esse objeto tem um número de propriedades que podem ser definidas antes de rodar a query. As mais utilizadas são :
Columns
-Permite você especificar quais os campos que serão retornados para a sua query . Para uma lista completa de tudo que pode ser definido aqui , aconselho procurara no help , mas para o nosso exemplo vamos retornar o seguinte :
doctitle - O título da página (especificado pela tag <TITLE>...</TITLE> ) ;
vpath - O caminho virtual da página ;
characterization - A descrição da página ;
rank - O valor especificado como padrão para bater com o critério da procura ;
ixQuery.Columns = "doctitle, vpath, size, characterization, rank"
Sortby
-Especifica como os resultados encontrados serão ordenados . Lista os campos em uma ordem relevante , e usa "[d]" para especificar que o campo deve ser ordenado de forma descendente .
ixQuery.SortBy = "rank[d], doctitle"
MaxRecords
- Você deve limitar o número máximo de resultados que a query pode retornar .
ixQuery.MaxRecords = 300
Catalog
Um Catalogo representa o resultado da indexação para um diretório específico (ou diretórios ) . Se você não especificar um catálogo então o Index Servcer usará o catalogo do Default Web Site ( cuja indexação começa em /inetpub/wwwroot ). Algumas vezes você pode querer especificar um catálogo . Se seu site estiver em um diretório diferente você poderá criar catálogos multiplos para diferentes páginas de procura .
Para definir um Catálogo , vá até o Index Server , que se encontra na opção "Services and Applications" , dentro do item do "Administrative Tools" , Computer Managment (Start -> Programs -> Admin. Tools ) . Clique com o botão direito em "Indexing Services" e selecione New -> Catalog . Entre o nome do novo catálogo e a localização do diretório que você quer indexar . Você também pode especificar diretórios dentro da árvore de diretórios que não devem ser indexados , mantendo o controle e a privacidade de determinados diretórios .
Especifique o catalogo que você irá utilizar com o seguinte código ( No meu exemplo , indexaria o diretório Lula_Pro ) :
ixQuery.Catalog = "Lula_Pro"
Abra o Internet Service Manager ( também conhecido como IIS ) , abra a caixa de propriedades do seu site , selecione o tab "Home Directory" e verifique que a opção "Index this resource" esteja selecionada .
Query
A Query atual . É ela quem faz toda a operação de indexação . O index Server suporta 3 linguagens para a construção da query : Dialect 1 (Index Server 1.0), Dialect 2 (Index Server 3.0) and SQL (Index Server 2.0 and above). Dê uma olhada no MSDN sobre "Query Languages for Indexing Service^ para uma explicação completa das diferentes linguagens .
Em nosso caso , vamos trabalhar com o mais simples , que é o dialect 1 , mas se sinta a vontade para utilizar sintaxes SQL , se preferir .
A grosso modo , você pode simplesmente definir a propriedade Query do seu Objeto Index Server como o alvo da sua procura . Por exemplo , se você estivesse procurando por todas as páginas que contenham a palavra "Lula" , você usaria :
ixQuery.Query = "Apples"
Pode pode refinar essa procura especificando quais arquivos devem e quais arquivos não devem ser procurados , O modo como a target do query deve ser interpretada ( como uma frase, um texto livre ou uma procura exata ) e também o tipo de páginas que será procuradas (por exemplo , páginas escritas em uma certa data , ou menores que um determinado tamanho) .
Um exemplo de uma procura livre por um texto , na frase 'ASP 4 Developers' , nós usuariamos :
$contents ASP 4 Developers
Para defnir restrições utilizamos o prefixo arroba "@" em um campo pré-definido e uma expressão . Por exemplo :
@size < 1000000 ' O tamanho do arquivo deve ser menor que 1,000,000 bytes
@contents Lula ' O conteúdo precisa conter a palavra "Lula"
@write > 74/09/30 ' A página deve ter sido escrita no dia 30 de setembro de 1974 (aa/mm/dd , usando default )
Restrições do nome do arquivo devem conter o prefixo "#" para especificar a procura regular da expressão :
#filename *.asp ' pesquisar apenas arquivos .ASP
#vpath *\artigos* ' procurar apenas no subdiretório artigos
Todas as expressões podem ser combinadas utilizando os operadores booleanod AND , NOT , OR etc . Supondo que você queira procurar a palavra "Lula" apenas em páginas ASP , e você gostaria de ignorar aqueles diretórios criados pelas Front Page Server Extensions , os "_vti" sei lá o que . A sintaxe ficaria :
ixQuery.Query = "(#filename *.asp) AND (NOT #vpath *\_vti*) AND (Lula)"
O objeto Utility
O Objeto relacionado com o Index Server . Permite você definir até onde irá a sua procura . Pode ser "shallow" ( para a procura apenas no diretório ) ou "deep" (para uma procura recursiva em todos os diretórios e subdiretórios ) .
dim util
set util = Server.CreateObject("ixsso.Util")
util.AddScopeToQuery ixQuery, Server.MapPath("/"), "deep"
O primeiro parâmetro especifica para qual objeto Index Server relacionado a associação deve ser feita . O segundo especifica o caminho físico onde a procura irá iniciar ( no exemplo , no diretório raíz ) . O terceiro por fim especifica onde vai qual é o tipo da procura .
Fazendo a procura
Para rodar a Query atual , basta Query.CreateRecordset
dim queryRS ' Query recordset.
set queryRS = ixQuery.CreateRecordSet("nonsequential")
Mostrando os resultados :
Para mostrar os resultados da pesquisa , faça um loop pelo recordset
Response.Write "<table width=100>"
do while not queryRS.EOF
' Recebe o título do documento . Se estiver em branco é mostrado "Untitled".
dim docTitle
docTitle = queryRS("doctitle")
if docTitle = "" then docTitle = "Untitled"
' Mostra o # do registro , o link para o documento , a URL e a caracterização
Response.Write "<tr>"
Response.Write "<td valign=top>" & recordNumber & ".</td>"
Response.Write "<td valign=top>"
Response.Write "<a href='" & queryRS("vpath") & "'>" & docTitle & "</a><br>"
Response.Write "<b>URL: </b> http://" & Request.ServerVariables("server_name") & queryRS("vpath") & "<br>"
Response.Write Server.HTMLEncode(queryRS("characterization"))
Response.Write "</td>"
Response.Write "</tr>"
recordNumber = recordNumber + 1
queryRS.MoveNext()
loop
Response.Write "</table>"
Esta matéria foi postada originalmente no ASP4Developers por Luigi Paolo ( Lula ) (site), que na época era "Professor e Analista de Sistemas .". Hoje, vai saber...