web-dev-qa-db-fra.com

Agrégation des termes Elasticsearch par chaînes dans un tableau

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.

16
Marieke

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

12
Sloan Ahrens