агрегация (много значений в одном поле) elasticsearch - PullRequest
1 голос
/ 05 августа 2020

У меня много значений в одном поле, когда я делаю агрегирование, я получаю эти значения как отдельные значения.

Пример:

name : jess , Region : new york 
name : jess , Region : poland

запрос:

  query = {
        "size": total,
        "aggs": {
        "buckets_for_name": {
            "terms": {
                 "field": "name",
                 "size": total
             },
            "aggs": {
                "region_terms": {
                    "terms": {
                        "field": "region",
                        "size": total
                    }
                }
            }
        }
        }
    }

с response["aggregations"]["buckets_for_name"]["buckets"] получаю :

 {'key': 'jess ', 'doc_count': 61, 'region_terms': {'doc_count_error_upper_bound': 0, 'sum_other_doc_count': 0, 'buckets': [{'key': 'oran', 'doc_count': 60}, {'key': 'new ', 'doc_count': 1}, {'key': 'york', 'doc_count': 1}]}}, {'key': 'jess ', 'doc_count': 50, 'egion_terms': {'doc_count_error_upper_bound': 0, 'sum_other_doc_count': 0, 'buckets': [{'key': 'poland', 'doc_count': 50}]}}

с

pretty_results = []
for result in response["aggregations"]["buckets_for_name"]["buckets"]:
    d = dict()
    d["name"] = result["key"]
    d["region"] = []
    for region in result["region_terms"]["buckets"]:
        d["region "].append(region ["key"])
        pretty_results.append(d)
        print(d)

я получаю :

{'name': 'jess ', 'region ': ['new' , 'york', 'poland']}

Я хочу получить такой результат:

{'name': 'jess ', 'region ': ['new york', 'poland']}

1 Ответ

2 голосов
/ 05 августа 2020

Поля region (и я предполагаю name) были проанализированы с помощью стандартного анализатора, который визуализировал new york для разделения на токены [new, york].

What вы можете настроить отображение keyword для обработки строк как автономных токенов:

PUT regions
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fielddata": true,
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "region": {
        "type": "text",
        "fielddata": true,
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

После этого выполните свои aggs в полях .keyword:

{
  "size": 200,
  "aggs": {
    "buckets_for_name": {
      "terms": {
        "field": "name.keyword",         <---
        "size": 200
      },
      "aggs": {
        "region_terms": {
          "terms": {
            "field": "region.keyword",   <---
            "size": 200
          }
        }
      }
    }
  }
}

Если вы хотите оставить newyork без пробелов, обратите внимание на фильтр pattern_replace в ваших анализаторах.

ИЗМЕНИТЬ из комментариев Агенты не являются частью запроса - у них есть собственная область действия - поэтому измените это

{
  "query": {
    "aggs": {
      "buckets_for_name": {

на это

{
  "query": {
     // possibly leave the whole query attribute out
   },
   "aggs": {
      "buckets_for_name": {
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...