Comment puis-je écrire une agrégation de termes Elasticsearch qui divise les compartiments par le terme entier plutôt que par des jetons individuels? Par exemple, je voudrais agréger par état, mais ce qui suit renvoie new, york, jersey et california comme seaux individuels, et non New York et New Jersey et California comme seaux comme prévu:
curl -XPOST "http://localhost:9200/my_index/_search" -d'
{
"aggs" : {
"states" : {
"terms" : {
"field" : "states",
"size": 10
}
}
}
}'
Mon cas d'utilisation est comme celui décrit ici https://www.elastic.co/guide/en/elasticsearch/guide/current/aggregations-and-analysis.html avec une seule différence: la ville champ est un tableau dans mon cas.
Exemple d'objet:
{
"states": ["New York", "New Jersey", "California"]
}
Il semble que la solution proposée (mappant le champ comme non analysé) ne fonctionne pas pour les tableaux.
Ma cartographie:
{
"properties": {
"states": {
"type":"object",
"fields": {
"raw": {
"type":"object",
"index":"not_analyzed"
}
}
}
}
}
J'ai essayé de remplacer "objet" par "chaîne" mais cela ne fonctionne pas non plus.
Je pense que tout ce qui vous manque c'est "states.raw"
dans votre agrégation (notez que, comme aucun analyseur n'est spécifié, le "states"
le champ est analysé avec analyseur standard ; le sous-champ "raw"
est "not_analyzed"
). Bien que votre cartographie puisse également être examinée. Lorsque j'ai essayé votre mappage contre ES 2.0, j'ai eu quelques erreurs, mais cela a fonctionné:
PUT /test_index
{
"mappings": {
"doc": {
"properties": {
"states": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
Ensuite, j'ai ajouté quelques documents:
POST /test_index/doc/_bulk
{"index":{"_id":1}}
{"states":["New York","New Jersey","California"]}
{"index":{"_id":2}}
{"states":["New York","North Carolina","North Dakota"]}
Et cette requête semble faire ce que vous voulez:
POST /test_index/_search
{
"size": 0,
"aggs" : {
"states" : {
"terms" : {
"field" : "states.raw",
"size": 10
}
}
}
}
retour:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0,
"hits": []
},
"aggregations": {
"states": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "New York",
"doc_count": 2
},
{
"key": "California",
"doc_count": 1
},
{
"key": "New Jersey",
"doc_count": 1
},
{
"key": "North Carolina",
"doc_count": 1
},
{
"key": "North Dakota",
"doc_count": 1
}
]
}
}
}
Voici le code que j'ai utilisé pour le tester:
http://sense.qbox.io/Gist/31851c3cfee8c1896eb4b53bc1ddd39ae87b173e