Il semble que votre question porte davantage sur la fusion des index que sur l'indexation elle-même.
Le processus d'indexation est assez simple si l'on ignore les détails de bas niveau. Lucene forme ce que l'on appelle un "index inversé" à partir des documents. Ainsi, si un document contenant le texte "To be or not to be" et id=1 arrive, l'index inversé ressemblera à ceci :
[to] → 1
[be] → 1
[or] → 1
[not] → 1
Il s'agit essentiellement de l'indice du mot à la liste de documents contenant un mot donné. Chaque ligne de cet index (mot) est appelée liste d'affichage. Cet index est ensuite persisté sur un stockage à long terme.
En réalité, les choses sont bien sûr plus compliquées :
- Lucene peut sauter certains mots en fonction de l'analyseur particulier donné ;
- Les mots peuvent être prétraités à l'aide d'un algorithme de stemming afin de réduire la flexion de la langue ;
- La liste d'affichage peut contenir non seulement les identifiants des documents, mais aussi le décalage du mot donné dans le document (potentiellement plusieurs instances) et d'autres informations supplémentaires.
Il existe de nombreuses autres complications qui ne sont pas aussi importantes pour la compréhension de base.
Il est important de comprendre cependant que l'index Lucene est ajouter seulement . À un moment donné, l'application décide de valider (publier) tous les changements dans l'index. Lucene termine toutes les opérations de service avec l'index et le ferme, ainsi il est disponible pour la recherche. Après la validation, l'index est fondamentalement immuable. Cet index (ou partie d'index) est appelé segment . Lorsque Lucene exécute une recherche pour une requête, il recherche dans tous les segments disponibles.
La question se pose donc : comment pouvons-nous modifier un document déjà indexé ?
Les nouveaux documents ou les nouvelles versions de documents déjà indexés sont indexés dans les nouveaux segments et les anciennes versions sont invalidées dans les segments précédents à l'aide de ce que l'on appelle le "système d'indexation". liste de mise à mort . La Kill list est la seule partie de l'index engagé qui peut changer. Comme vous pouvez le deviner, l'efficacité de l'index diminue avec le temps, car les anciens index peuvent contenir la plupart des documents supprimés.
C'est là que la fusion entre en jeu. La fusion est le processus qui consiste à combiner plusieurs index pour obtenir un index plus efficace dans son ensemble. Pendant la fusion, les documents vivants sont copiés dans le nouveau segment et les anciens segments sont entièrement supprimés.
En utilisant ce processus simple, Lucene est capable de maintenir l'index en bon état en termes de performance de recherche.
J'espère que ça vous aidera.
0 votes
La plupart des réponses ici sont correctes : d'abord Lucene crée l'indice inversé, mais cela n'explique pas le point essentiel de la façon dont cet indice de terme devient ensuite a cherché (et c'est, je crois, ce que le PO a réellement demandé). Vous trouverez donc ci-dessous une nouvelle réponse à cette question plutôt ancienne qui, je l'espère, vous apportera un meilleur éclairage.
1 votes
J'ai mis à jour ma réponse une fois de plus, car les réponses actuelles (y compris la mienne !) ne sont pas vraiment satisfaisantes pour répondre aux deux questions principales du PO (comment Lucene fournit-il une indexation optimisée et par quel algorithme particulier - une Skip-List, pas un B-Tree, BTW). J'espère que mes mises à jour finales répondent maintenant correctement à la question actuelle !