Comment fonctionne Lucene

90

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.

Midhat
la source
2
Puis-je demander que cette question soit convertie en wiki communautaire? Lucene ressemble maintenant à une plate-forme.
asyncwait

Réponses:

75

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 varcharchamp 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.

bmargulies
la source
Si je comprends bien, ce qui distingue les moteurs de recherche de texte, c'est la façon dont ils gèrent les recherches de plusieurs mots et joignent les résultats des recherches à plusieurs index en temps réel. Je ne suggérerais pas de consulter la source Lucene pour cela. Il serait probablement préférable de lire un peu plus sur la théorie de la recherche de texte, la réponse de @ alienCoder m'a aidé.
Chris Dutrow
1
@bmargulies, Si l'indexation est "par mot", alors pourquoi la recherche utilisateur de stackoverflow stackoverflow.com/users autorise-t-elle les correspondances de sous-chaînes?
Pacerier
2
Ce n'est pas le lieu pour des réponses complètes. Il y a un certain nombre d'élaborations sur le concept de base là-dedans.
bmargulies
Que voulez-vous dire "un index pour chaque mot" ... si je commence à taper "abc", comment va-t-il trouver "abc" dans le document?
Alexander Mills
1
Un index (arbre B) d'un mot à un document peut rechercher des documents par mots dans le document car le tableau d'un tel index est (mot, document) où l'index est sur la colonne de mot. Prenons une requête comme: "Rechercher des documents contenant les mots" police "," crime "," statistiques "". En recherchant l'index de mots, vous pouvez effectuer trois recherches de journal (N) pour obtenir des documents O (N) contenant l'un de ces mots. Ensuite, vous pouvez faire deux boucles O (N) pour créer un ensemble contenant des documents contenant les trois mots. Bien qu'il s'agisse théoriquement d'une opération O (N), la plupart des documents n'ont pas les trois mots, donc son O (n) où n <N.
Calicoder
34

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

alienCoder
la source
8
Écrémé sur ce papier, c'était assez utile. Plus précisément, "4.5 Recherche" avait la réponse que je cherchais. Plus précisément, cela ressemble à une recherche de hachage O (1) est utilisée pour des mots individuels, mais ensuite une analyse O (n) est utilisée pour joindre les résultats avec une limite de 40 000 documents. Je suppose qu'un algorithme de réduction de carte est utilisé pour diviser ce travail afin que l'utilisateur obtienne des résultats instantanés.
Chris Dutrow
Un algorithme populaire est l'algorithme de classement des pigeons. Bien que je ne sache pas grand-chose à ce sujet.
alienCoder
3
Cet article est amusant: "Dans cet article, nous présentons Google, un prototype ...". Je suppose que Google n'a pas toujours été une méga-société.
Buttons840
Je ne connais pas Lucene, mais une question: le classement se produit à chaque recherche? Ou maintient-il les documents pré-classés? S'il maintient à l'avance les documents selon le rang, comment le maintient-il pour une requête de plusieurs mots?
Vikas Prasad
Le lien est rompu maintenant. @alienCoder
CEGRD
20

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é.

duffymo
la source
10
Oui, je comprends la partie indexation, mais encore une fois, les recherches d'index lucene sont beaucoup plus rapides que les recherches d'index mysql. Comment cela se passe
Midhat
8

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.

Exemple :

Fichier 1: la mémoire à accès aléatoire 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 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).

Tom Taylor
la source