J'aimerais savoir comment la recherche lucene fonctionne si vite. Je ne trouve aucune documentation utile sur le Web. Si vous avez quelque chose (à part le code source de 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.
Réponses:
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 . Puisque 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
varchar
champ pourrait être tout aussi rapide, et en fait, je pense que vous constaterez 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 le traitement des transactions. Lorsque vous ajoutez un document, il n'est pas nécessaire de garantir 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. Après tout, les deux choses auxquelles vous faites référence sont open source.
la source
Lucene crée un gros index. L'index contient l'identifiant du mot, le nombre de documents où le mot est présent et la position du mot dans ces documents. Ainsi, lorsque vous donnez une requête sur un seul mot, 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, prenez simplement 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
la source
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 structure de données de table de hachage O (1). La liste doit parcourir toute la collection pour trouver ce que vous voulez. La table de hachage a un index qui lui permet de déterminer exactement où se trouve l'élément souhaité et de le récupérer simplement.
Mettre à 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, MySQL doit effectuer une analyse de table sur chaque ligne, qui sera O (N).
Lucene peut analyser le document en jetons, les regrouper en n-grammes dans votre direction et calculer les index pour chacun d'entre eux. C'est O (1) pour trouver un mot dans un document Lucene indexé.
la source
Lucene fonctionne avec la fréquence des termes et la 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.
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 généré en fonction du poids. Considérez la requête de recherche "Main Memory", elle recherche les 4 mots individuellement et le résultat serait comme,
Principale
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 plus se laisser emporter par les poids sur les mots les plus courants comme «et», »ou«, », il considère la fréquence inverse du document (c'est-à-dire« cela diminue le poids du mot le plus populaire parmi l'ensemble de documents).
la source