Je voudrais savoir comment la recherche lucene fonctionne si rapidement. Je ne trouve aucun document utile sur le Web. Si vous avez quelque chose (à court de code source lucene) à lire, faites le moi savoir.
Une requête de recherche de texte utilisant la recherche de texte mysql5 avec index prend environ 18 minutes dans mon cas. Une recherche lucene pour la même requête prend moins d'une seconde.
Lucene est un index de texte intégral inversé. Cela signifie qu'il prend tous les documents, les divise en mots, puis crée un index pour chaque mot. Étant donné que l'index est une correspondance de chaîne exacte, non ordonnée, il peut être extrêmement rapide. En théorie, un index SQL non ordonné sur un champ varchar
pourrait être tout aussi rapide, et en fait, je pense que vous trouverez que les grandes bases de données peuvent faire une simple requête d'égalité de chaîne très rapidement dans ce cas.
Lucene n'a pas besoin d'optimiser pour le traitement des transactions. Lorsque vous ajoutez un document, il n'est pas nécessaire de s'assurer que les requêtes le voient instantanément. Et il n'est pas nécessaire d'optimiser les mises à jour des documents existants.
Cependant, à la fin de la journée, si vous voulez vraiment savoir, vous devez lire la source. Les deux choses que vous référencez sont open source, après tout.
Lucene crée un gros index. L'index contient l'ID Word, le nombre de documents où le mot est présent et la position du mot dans ces documents. Ainsi, lorsque vous effectuez une seule requête Word, il recherche simplement l'index (complexité temporelle O (1)). Ensuite, le résultat est classé à l'aide de différents algorithmes. Pour une requête multi-mots, il suffit de prendre l'intersection de l'ensemble de fichiers où les mots sont présents. Ainsi Lucene est très très rapide.
Pour plus d'informations, lisez cet article des développeurs Google - http://infolab.stanford.edu/~backrub/google.html
En un mot: l'indexation.
Lucene crée un index de votre document qui lui permet de rechercher beaucoup plus rapidement.
C'est la même différence entre une structure de données de liste O(N) et une table de hachage O(1) structure de données. La liste doit parcourir l'intégralité de la pour trouver ce que vous voulez. La table de hachage possède un index qui lui permet de déterminer exactement où se trouve l'élément souhaité et de le récupérer simplement.
Mise à jour:
Je ne suis pas certain de ce que vous entendez par "les recherches d'index Lucene sont beaucoup plus rapides que les recherches d'index mysql."
Je suppose que vous utilisez MySQL "WHERE document LIKE '% phrase%'" pour rechercher un document. Si c'est vrai, alors MySQL doit faire un scan de table sur chaque ligne, qui sera O (N).
Lucene arrive à analyser le document en jetons, à les regrouper en n-grammes selon votre direction et à calculer les index pour chacun d'entre eux. C'est O(1) pour trouver un mot dans un document Lucene indexé.
Lucene fonctionne avec Fréquence des termes et fréquence des documents inverses. Il crée un index mappant chaque mot avec le document et son nombre de fréquences qui n'est rien d'autre qu'un index inverse sur le document.
Exemple :
Fichier 1: Random Access Memory est la mémoire principale.
Fichier 2: les disques durs sont de la mémoire secondaire.
Lucene crée un index inversé quelque chose comme
Fichier 1:
Terme: aléatoire
Fréquence: 1
Position: 0
Terme: Mémoire
Fréquence: 2
Position: 3
Position: 6
Il est donc capable de rechercher et de récupérer rapidement le contenu recherché. Lorsqu'il y a trop de correspondances pour la requête de recherche, le résultat est basé sur le poids. Considérez la requête de recherche "Mémoire principale" elle recherche les 4 mots individuellement et le résultat serait comme,
Principal
Fichier 1: Fréquence - 1
Mémoire
Fichier 1: Fréquence - 2
Fichier 2: Fréquence - 1
Le résultat serait File1 suivi de File2 . Pour ne pas se laisser emporter par les poids sur les mots les plus courants comme 'et', 'ou', 'le' il considère la fréquence inverse du document (c'est-à-dire 'qu'il diminue le poids du mot qui est le plus populaire parmi l'ensemble de documents).