Agrégation de termes importants pour les tableaux dans Elasticsearch


écrit de mandamus

Je ne parviens pas à effectuer une agrégation de termes significatifs à l'aide d'un champ qui est un tableau. Ma requête Javascript ressemble à ceci :

client.search({
  index: myIndex,
  body: {
    query: {
      terms: {
        myField: ['someuserid']
        // also tried with same result... myField: 'someuserid'
      }
    },
    aggregations: {
      recommendations: {
        significant_terms: {
          field: "myField",
          min_doc_count: 1
        }
      }
    }
  }
})

J'obtiens cette erreur :

(node:13105) UnhandledPromiseRejectionWarning: Unhandled promise rejection 
(rejection id: 1): Error: [illegal_argument_exception] Fielddata is disabled 
on text fields by default. Set fielddata=true on [myField] in order to 
load fielddata in memory by uninverting the inverted index. Note that this can 
however use significant memory.

Ma cartographie ressemble à ceci :

{
  index: 'myIndex',
  type: 'users',
  body: {
    properties: {
        'myField': []
    }
  }
}

Je sais que je n'ai pas besoin de mapper explicitement les types de données de tableau, mais je le fais pour pouvoir facilement voir quels champs j'ai pour un certain fichier type. Suite au message d'erreur, je modifierais mon mappage pour qu'il ressemble à ceci :

...
properties: {
  myField: {
    fielddata: "true"
  }
}
...

Cependant, cela entraîne cette erreur :

Error: [mapper_parsing_exception] No type specified for field [myField]

Si je devais ensuite ajouter un type : ... properties : { myField : { type : [], fielddata : "true" } } ... j'obtiendrais cette erreur :

[mapper_parsing_exception] No handler for type [[]] declared on field [myField]

Actuellement, les données que j'agrége proviennent de données qui sont ensemencées via la bibliothèque cliente Javascript à l'aide de l'API de mise à jour construite avec ceci :

const update = {
    "upsert": {
      "myField": ['myValue']
    },
    "script": {
    "inline": "ctx._source.myField.add(params.itemField)",
    "params": {
      "itemField": 'itemValue'
    }
  }
};

const req = {
    index: 'myIndex',
    type: 'users',
    id: 'someuserid',
    body: update
}

Les résultats de cette requête curl -XGET 'localhost:9200/myIndex/users/_search?pretty'ressembleraient alors à ceci :

...
{
    "_index" : "myIndex",
    "_type" : "users",
    "_id" : "someuserid",
    "_score" : 1.0,
    "_source" : {
      "myField" : [
        "someFieldId1",
        "someFieldId1",
        "someFieldId2"
      ]
    }
  },
...

Comment puis-je effectuer correctement une agrégation de termes significatifs à l'aide d'un champ qui est un tableau ?

mort

https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html

Dans Elasticsearch, il n'y a pas de type de baie dédié. Tout champ peut contenir zéro ou plusieurs valeurs par défaut, cependant, toutes les valeurs du tableau doivent être du même type de données.

En supposant que vous utilisiez ElasticSearch 5.x, essayez de changer le type : [] pour taper : "text" ou tapez : "keyword"

Pour la différence entre les deux, je recommanderais de lire ceci : https://www.elastic.co/guide/en/elasticsearch/reference/current/text.html

Cependant, dans votre cas, puisqu'il ressemble à une sorte d'identifiant, il n'a probablement pas besoin d'être analysé, je suggérerais donc "mot-clé" au lieu de "texte".

Pour les versions précédentes d'ES, utilisez plutôt "string". https://www.elastic.co/guide/en/elasticsearch/reference/2.4/string.html

Articles connexes


agrégation de termes elasticsearch avec filtrage

Egor Lebedev J'ai des entités comme celle-ci dans l' fooindex: {ids: ["aa", "bb"]} {ids: ["aa", "cc"]} {ids: ["ee"]} {ids: ["ff" , "cc"]} Fondamentalement, je veux savoir s'il existe des documents pour les identifiants aaet les fichiers ee. J'ai essayé de le

changer les crochets pour l'agrégation de tableaux dans postgres

StellaMaris J'aime changer les crochets "{" et "}" en "[" et "]" dans l'exemple suivant. J'ai une table A avec deux colonnes, l'une est text_1 de type string et la seconde est count de type bigint. Ce que j'essaie de faire, c'est de renvoyer une notation matri