Eu gostaria de saber como a pesquisa lucene funciona tão rápido. Não consigo encontrar nenhum documento útil na web. Se você tiver qualquer coisa (exceto o código-fonte lucene) para ler, me avise.
Uma consulta de pesquisa de texto usando pesquisa de texto mysql5 com índice leva cerca de 18 minutos no meu caso. Uma pesquisa lucene para a mesma consulta leva menos de um segundo.
Respostas:
Lucene é um índice de texto completo invertido. Isso significa que ele pega todos os documentos, os divide em palavras e, a seguir, cria um índice para cada palavra . Como o índice é uma correspondência exata de string, não ordenado, pode ser extremamente rápido. Hipoteticamente, um índice SQL não ordenado em um
varchar
campo poderia ser tão rápido e, de fato, acho que você descobrirá que os grandes bancos de dados podem fazer uma consulta simples de igualdade de strings muito rapidamente nesse caso.Lucene não precisa otimizar o processamento de transações. Quando você adiciona um documento, não é necessário garantir que as consultas o vejam instantaneamente . E não precisa otimizar para atualizações de documentos existentes.
No entanto, no final do dia, se você realmente quiser saber, você precisa ler a fonte. Afinal, ambas as coisas que você faz referência são de código aberto.
fonte
Lucene cria um grande índice. O índice contém a id da palavra, o número de documentos onde a palavra está presente e a posição da palavra nesses documentos. Portanto, quando você dá uma consulta de palavra única, ela apenas pesquisa o índice (complexidade de tempo O (1)). Em seguida, o resultado é classificado usando diferentes algoritmos. Para consulta de várias palavras, basta pegar a interseção do conjunto de arquivos onde as palavras estão presentes. Portanto, Lucene é muito rápido.
Para obter mais informações, leia este artigo de desenvolvedores do Google- http://infolab.stanford.edu/~backrub/google.html
fonte
Em uma palavra: indexação.
O Lucene cria um índice do seu documento que permite uma pesquisa muito mais rápida.
É a mesma diferença entre uma estrutura de dados de lista O (N) e uma estrutura de dados de tabela hash O (1). A lista deve percorrer toda a coleção para encontrar o que você deseja. A tabela hash tem um índice que permite descobrir exatamente onde o item desejado está e simplesmente buscá-lo.
Atualizar:
Não tenho certeza do que você quer dizer com "pesquisas de índice Lucene são muito mais rápidas do que pesquisas de índice mysql."
Meu palpite é que você está usando o MySQL "WHERE document LIKE '% frase%'" para pesquisar um documento. Se isso for verdade, então o MySQL tem que fazer uma varredura de tabela em cada linha, que será O (N).
Lucene consegue analisar o documento em tokens, agrupá-los em n-gramas conforme sua orientação e calcular os índices para cada um deles. É O (1) para encontrar uma palavra em um documento Lucene indexado.
fonte
Lucene trabalha com frequência de termo e frequência de documento inverso . Ele cria um índice de mapeamento de cada palavra com o documento e sua contagem de frequência, que nada mais é do que o índice inverso do documento.
Lucene cria um índice reverso parecido com
Arquivo 1:
Termo: Aleatório
Frequência: 1
Posição: 0
Termo: Memória
Frequência: 2
Cargo: 3
Cargo: 6
Portanto, é capaz de pesquisar e recuperar o conteúdo pesquisado rapidamente. Quando há muitas correspondências para a consulta de pesquisa, ele exibe o resultado com base no peso. Considere a consulta de pesquisa "Memória principal", ela pesquisa por todas as 4 palavras individualmente e o resultado seria como,
a Principal
Arquivo 1: Frequência - 1
Memória
Arquivo 1: Frequência - 2
Arquivo 2: Frequência - 1
O resultado seria Arquivo1 seguido por Arquivo2 . Para não se deixar levar por pesos nas palavras mais comuns, como 'e', 'ou', 'o', ele considera a frequência inversa do documento (ou seja, 'diminui o peso da palavra mais popular no conjunto de documentos).
fonte