Agrégation de termes importants pour les tableaux dans Elasticsearch
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 ?
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