web-dev-qa-db-fra.com

Que sont les docValues ​​dans Solr? Quand dois-je les utiliser?

J'ai donc lu plusieurs sources qui tentent d'expliquer ce que sont les "docValues" dans Solr, mais je ne semble pas comprendre quand je dois les utiliser, en particulier en ce qui concerne les champs indexés vs stockés. Quelqu'un peut-il jeter un peu de lumière dessus?

8
gravetii

Que sont les docValues ​​dans Solr?

Les valeurs de doc peuvent être expliquées comme le stockage de valeurs de champ de pas de colonne de Lucene ou simplement comme un index non inversé ou un index direct.

Pour illustrer avec json:

  • orienté ligne (champs stockés)

    
    {
    'doc1': {'A':1, 'B':2, 'C':3},
    'doc2': {'A':2, 'B':3, 'C':4},
    'doc3': {'A':4, 'B':3, 'C':2}
    }
    
  • orienté colonne (docValues)

    
    {
    'A': {'doc1':1, 'doc2':2, 'doc3':4},
    'B': {'doc1':2, 'doc2':3, 'doc3':3},
    'C': {'doc1':3, 'doc2':4, 'doc3':2}
    }
    

Objectif de DocValues?

Les champs stockés stockent ensemble toutes les valeurs de champ pour un document de façon séquentielle. Lors de la récupération, toutes les valeurs de champ sont renvoyées en une seule fois par document, de sorte que le chargement des informations pertinentes sur un document est très rapide.

Cependant, si vous devez numériser un champ (pour le facettage/le tri/le regroupement/la mise en évidence), ce sera un processus lent, car vous devrez parcourir tous les documents et charger les champs de chaque document par itération, ce qui entraînera des recherches de disque.

Par exemple, lors du tri, lorsque tous les documents correspondants sont trouvés, Lucene doit obtenir la valeur d'un champ de chacun d'eux. De même, le moteur de facettage, par exemple, doit rechercher chaque terme qui apparaît dans chaque document qui constituera l'ensemble de résultats et extraire les ID de document afin de créer la liste des facettes.

Maintenant, ce problème peut être abordé de deux manières:

  • Utilisation des champs stockés existants. Dans ce cas, si vous commencez à trier/agréger sur un champ donné, les données seront paresseusement non inversées et placées dans un champCache au moment de la recherche afin que vous puissiez accéder aux valeurs en fonction d'un ID de document. Ce processus est très gourmand en CPU et en E/S.
  • Les DocValues ​​sont assez rapides d'accès au moment de la recherche, car elles sont stockées sous forme de colonne de telle sorte que seule la valeur de ce champ doit être décodée par hit. Cette approche promet de soulager certaines des exigences de mémoire du fieldCache et de rendre les recherches pour le facettage, le tri et le regroupement beaucoup plus rapides.

Comme les valeurs de document d'index inversé sont sérialisées sur le disque dans ce cas, nous pouvons compter sur le cache du système de fichiers du système d'exploitation pour gérer la mémoire au lieu de conserver les structures sur le tas JVM.

Quand dois-je les utiliser?

Pour toutes les raisons évoquées ci-dessus. Si vous vous trouvez dans un environnement à faible mémoire ou si vous n'avez pas besoin d'indexer un champ, les DocValues ​​sont parfaites pour le facettage/regroupement/filtrage/tri/requêtes de fonction. Ils ont également le potentiel d'augmenter le nombre de champs que vous pouvez facettiser/grouper/filtrer/trier sans augmenter vos besoins en mémoire. J'ai utilisé docvalues ​​dans la production Solr pour le tri et le facettage et j'ai constaté une énorme amélioration des performances de ces requêtes.

20
kpahwa

Les cas d'utilisation de DocValues ​​sont déjà expliqués par @Persimmonium et sont assez clairs. ils sont bons pour le facettage et le tri et bien d'autres choses fantaisistes dans le monde infrarouge.

Que sont docValue et pourquoi sont-ils là? docValue n'est rien mais est un moyen de construire un index direct afin que les documents pointent vers des valeurs. ils sont conçus pour surmonter les limitations de FieldCache en fournissant un mappage de document à valeur construit au moment de l'index et ils stockent les valeurs en mode colonne et il fait tout le poids lourd pendant l'indexation de document.

Quelles sont les valeurs de doc:

compatible NRT: Ce sont des infrastructures de données par segment construites au moment de l'index et conçues pour être efficaces dans le cas d'utilisation où les données changent rapidement.

Prise en charge de requête/filtre de base: Vous pouvez effectuer des requêtes de base, de plage, etc. sur les champs docvalues ​​sans les indexer également, mais celles-ci sont à score constant uniquement et généralement plus lentes. Si vous vous souciez des performances et de la notation, indexez également le champ.

Meilleure compression que fieldcache: Les champs docvalues ​​se compressent mieux que fieldcache, et la "folie" est impossible.

Capable de stocker des données en dehors de la mémoire du tas: Vous pouvez spécifier un docValuesFormat différent sur le fieldType (docValuesFormat = "Disk") pour ne charger que des données minimales sur le tas, en conservant d'autres structures de données sur le disque.

Quelles valeurs doc ne sont pas:

Pas un remplacement pour les champs stockés: Ceux-ci ne sont pas liés aux champs stockés dans tous les sens et à la place des infrastructures de données pour la recherche (tri/facette/group/join/scoring).

Cas d'utilisation à utiliser avec Lucene docValues ​​de cette façon.

    public Bits getDocsWithField(FieldInfo field) throws IOException {
  switch(field.getDocValuesType()) {
    case SORTED_SET:
      return DocValues.docsWithValue(getSortedSet(field), maxDoc);
    case SORTED_NUMERIC:
      return DocValues.docsWithValue(getSortedNumeric(field), maxDoc);
    case SORTED:
      return DocValues.docsWithValue(getSorted(field), maxDoc);
    case BINARY:
      BinaryEntry be = binaries.get(field.number);
      return getMissingBits(be.missingOffset);
    case NUMERIC:
      NumericEntry ne = numerics.get(field.number);
      return getMissingBits(ne.missingOffset);
    default:
      throw new AssertionError();
  }
}
6
Prakhar Nigam

En raison de la façon dont ils sont stockés et accessibles, ils accéléreront certaines opérations, comme le tri, le facettage, etc.

De plus, ils sont obligatoires pour utiliser certaines fonctionnalités: streaming d'expressions, mises à jour sur place ...

Donc, en cas de doute:

  1. si vous n'avez pas un gros index et que la taille n'est pas un problème, activez-les simplement
  2. si vous avez un énorme index, ou si l'indexation est essentielle, examinez-les plus attentivement et choisissez les champs sur lesquels les activer.
4
Persimmonium