Составные elasti c сегменты поиска только в тех случаях, когда существуют оба источника - PullRequest
1 голос
/ 07 мая 2020
• 1000 элементов, которые имеют, например, AB C в первом или втором поле. Это не было бы сегментированием, потому что это означало бы, что документ может go разделиться на два сегмента (если firstfield или secondfield отличаются). Но продолжу решать мою текущую проблему. Таким образом, эта агрегация просто имеет ведение первого поля + второго поля, как я знаю, и этого было бы достаточно для меня. Проблема в том, что в тех случаях, когда, например, отсутствует второе поле, не существует корзины, которая равна firstfield: something, secondfield: empty . Таким образом, многие элементы не попадают в сегмент.

В документации указано, что необходимо определить все поля: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html

Что я могу сделать, чтобы получить аналогичные результаты, но с ведением типа

{
   "key": {
      "abc.firstfield": "abcd"
   },
   "doc_count": 123
}

Я видел только такой возможный подход, но это означает, что я должен быть уверен, что первое поле всегда доступно:

"aggs": {
        "first": {
            "terms": {
                "size": 10000,
                "field": "abc.firstfield"
            },
            "aggs": {
                "second": {
                    "terms": {
                        "size": 10000,
                        "field": "abc.secondfield"
                    }
                }
            }
        }
    }

И у него есть немного более грязный результат, чтобы проанализировать на мой вкус.

1 Ответ

1 голос
/ 07 мая 2020

При составном агрегировании вы можете использовать missing_bucket: true

{
  "aggs": {
    "my_buckets": {
      "composite": {
        "sources": [
          {
            "field1": {
              "terms": {
                "field": "field1.keyword",
                "missing_bucket": true
              }
            }
          },
          {
            "field2": {
              "terms": {
                "field": "field2.keyword",
                "missing_bucket": true
              }
            }
          }
        ],
        "size": 10000
      }
    }
  }
}

Результат:

"buckets" : [
        {
          "key" : {
            "field1" : "abc",
            "field2" : "xyz"
          },
          "doc_count" : 1
        },
        {
          "key" : {
            "field1" : "def",
            "field2" : null
          },
          "doc_count" : 1
        }
      ]
...