locate
(ou melhor, updatedb
) é um tanto simples: pega a saída de find
para os caminhos necessários (geralmente '/'), classifica-a e depois a compacta com uma ferramenta de compactação frontal ( frcode
), na qual os prefixos comuns consecutivos são substituídos por número de caracteres repetidos.
Então, eu estou pensando, o que está impedindo alguém de criar algo semelhante para pesquisa de texto completo? Diga, que tal concatenar cada arquivo no sistema, classificar cada linha com o formato line:filename:linenumber
e fazer a compactação frontal? Acho que você acabaria com um grep
, com a desvantagem de estar desatualizado até que o cron job diário/semanal seja executado, assim como locate
.
Talvez locategrep
seja um exagero para todo o sistema, mas posso ver que é útil para acelerar um grande projeto que não mudará muito pelo resto do dia.
Algo assim já existe ou é trivial de implementar com algumas ferramentas conhecidas?
Observação: prefiro evitar soluções corporativas que incluam recursos além da pesquisa de texto simples (mas aprecio o suporte a regex).
Freqüentemente, a competição GNU grep e BSD é muito lenta.
Pessoas como
ag
(akathe_silver_searcher
),rg
(akaripgrep
) ouack
; eles não tentam construir um índice do texto, eles apenas o pesquisam novamente para cada consulta, mas de uma maneira mais eficiente do quegrep
. Estou usando (principalmente)rg
hoje em dia, e isso realmente torna a pesquisa na árvore de origem Linux completa bastante gerenciável (uma "pesquisa em todos os arquivos, mesmo que não seja um cabeçalho C"rg FOOBAR
leva ~ 3s quando esquento os caches do sistema de arquivos; GNUgrep
leva > 10s).Há também mecanismos de pesquisa de texto completo (principalmente, xapian), que uso como plug-ins no meu servidor IMAP para acelerar a pesquisa de texto completo. Esse é o único caso de uso em que isso provou realmente fazer diferença para mim.
(Ceterum censeo
mandb
em esse delendam; nossas ferramentas de pesquisa são tão rápidas que levar 30s para reconstruir um maldito índice de 190 MB de páginas de manual simplesmente não é aceitável; e a ideia de que o gzip é um bom compressor para dados realmente uniformes, como páginas de manual onde há um dicionário de compactação que tornaria essas coisas incrivelmente pequenas é outro aborrecimento para mim. Mas as coisas estão interligadas o suficiente para que eu não possa ser movido para me livrar do mandb.)