indexação leve de documentos para lidar com menos de 250 mil registros em potencial

10

Recentemente, me vi irritado com as limitações dos mecanismos de indexação de documentos. Eu estava desenvolvendo um pequeno site que precisava de recursos de pesquisa bastante robustos, mas devido às restrições de hardware, não consegui implantar uma solução Lucene (como Solr ou ElasticSearch, como normalmente faria) para lidar com essa necessidade.

E mesmo assim, enquanto eu precisava fornecer alguns dados e cálculos complexos que consumiam muitos bancos de dados, não precisava lidar com mais de 250 mil registros em potencial. A implantação de uma instância inteira do Solr ou ES apenas para lidar com isso parecia um desperdício.

Depois de pensar sobre isso, parece um problema bastante grande. A maioria das pessoas lida com requisitos de pesquisa apenas com SQL. Eles apenas executam consultas SQL para seus dados e é isso. Suas capacidades de busca também acabam sendo terríveis.

  • Fazer uma pesquisa curinga de texto completo pode ser muito lento em alguns sistemas (hosts compartilhados em particular) e atolar seu banco de dados, especialmente se você tiver consultas complicadas e muitas associações.

  • Você acaba fazendo várias consultas em uma única solicitação do usuário. Você pode contornar isso com consultas cada vez mais complicadas, mas veja o ponto anterior.

  • Falta de recursos normalmente presentes em mecanismos de texto completo.

Os bancos de dados tinham o mesmo problema de precisar ser implantado como servidor e, em seguida, o SQLite apareceu e, de repente, pudemos implantar um banco de dados independente em um único arquivo. Meu Google não produziu nada - pergunto se existe algo assim para indexação / pesquisa de texto completo.

Quais fatores devem ser levados em consideração ao decidir se deve-se implementar a indexação leve de documentos (por exemplo, conforme explicado nas respostas a outra pergunta ) ou continuar usando o SQL para essas situações?

Jarrod Nettles
fonte
5
Por favor, não faça sua pesquisa de mercado aqui. A questão está fora de tópico aqui. Você pode ter mais sorte em solicitá-lo nas inicializações , mas leia primeiro as perguntas frequentes.
Oded
9
Whoa - Eu não estou olhando para começar uma empresa ou qualquer coisa aqui. Esta é apenas uma pergunta honesta à procura de tecnologia para usar em uma situação ou em uma solução diferente que está fora da caixa atual.
Jarrod Nettles
16
Este é um site sobre problemas conceituais no desenvolvimento de software. Por favor, não pergunte sobre problemas conceituais que você está tendo no desenvolvimento de software.
psr
3
Há uma boa pergunta lá ... acho que só precisa ser limpa para torná-la mais clara e específica.
precisa
3
Se sua única reclamação sobre o SQLite é a falta de indexação de texto, por que não usar o módulo de extensão FTS4 do SQLite ?
Brian

Respostas:

2

Você sabe, eu tenho que dizer para considerar usar redis.

  • Use a ideia de contexto . Seria difícil aprofundar-se sem saber mais sobre os documentos. Muitas vezes, você pode discernir muitas coisas dos títulos dos documentos. A criação de perfil de cada documento é o primeiro passo básico, assim como o rastreamento na Web.

  • Conte cada documento de palavras em um dicionário de palavras-chave. Acompanhe a contagem de popularidade de cada palavra para o projeto total. Adicione mais peso ao iterador para essa contagem se você conseguir detectar alta relevância em um documento ou conjunto.

    A primeira coisa que isso faz é fornecer uma lista abrangente de palavras em todo o seu conjunto. Qualquer coisa NÃO encontrada nessa lista, retorno automático de 'sem resultados'. Sugiro que a classificação de resultados abaixo de 5 a 20% da popularidade (ao executar a consulta de pesquisa no índice) também simplesmente diga que não há resultados '.

  • Se você não ir com algo como Redis, ou mesmo apenas fazer a sua própria estrutura de memória pode emparelhar documentos com arquivos descritores ou arquivo mini-db e objetos de páginas que descrevem cada documento de volta específico e para trás à memória. Mantenha as pesquisas comuns na memória, talvez competindo por slots ou dando-lhes um tempo de vida que cresce a cada pesquisa.

  • Para ir além, comece a salvar dados de referência que agrupam um link / ref / ponteiro / índice / qualquer um dos dois ou mais documentos e um conjunto de palavras-chave ou frases. Basicamente, você obtém uma nuvem de tags expandida.

  • Além disso, faça a detecção de frase rastreando quando uma palavra em seu dicionário é seguida ou precedida por uma sequência exata, comumente em documentos com metadados / títulos semelhantes. Isso é intenso, mas requer apenas uma passagem para renderizar os dados.

  • Quanto mais maneiras você puder segregar seus dados e manter os grupos relacionados entre si em uso real, melhor.

  • Conecte a probabilidade de correção rastreando toda vez que um usuário clica em um resultado que não seja dos três primeiros. Obtenha melhorias na detecção de frases assistindo pesquisas de usuários que não apresentaram resultados perfeitos. Force suas consultas a se tornarem relativas às pesquisas dos clientes.

  • Você precisa prestar atenção nas atualizações de documentos? O script Chronjobs / shell ou tarefas agendadas / script em lote podem ajudar. Existem várias opções para agendamento e script, embora obviamente.

  • Desperdiçar disco, ganhar velocidade, perder complexidade. Salve várias árvores dos seus documentos e / ou árvores de links nos documentos. Pesquise apenas nas árvores para quem os critérios foram atendidos ou, pelo menos, prefira-os para obter resultados mais rapidamente na maioria dos casos.

  • Crie seu próprio mecanismo de permutação leve ou encontre um que use detecção rápida de caracteres e sem regex. Ou apenas faça um usando regex em algumas horas, mas a diferença de desempenho será perceptível aqui para pesquisas suficientes.

  • Tantas coisas.

Essas são as possíveis soluções para implementar indexação e pesquisa robustas de documentos. Não é tudo incluído. E com isso, você provavelmente faria melhor em pegar uma caixa de reposição, jogar uma rede neural nela e passar alguns dias fazendo uma boa interface da Web para essa rede neural.

Garet Claborn
fonte