агрегация вложенных терминов на объекте, содержащем строковое поле - PullRequest
0 голосов
/ 29 апреля 2020

Мне нравится запускать агрегирование вложенных терминов в строковом поле, которое находится внутри объекта.

Обычно я использую этот запрос

      "terms": {
        "field": "fieldname.keyword"
      }

, чтобы включить fielddata

Но я не могу сделать это для такого вложенного документа, как этот

{
      "nested": {
        "path": "objectField"
      },
      "aggs": {
        "allmyaggs": {
          "terms": {
            "field": "objectField.fieldName.keyword"
          }
        }
      }
    }

Приведенный выше запрос просто возвращает массив пустых сегментов

Есть ли способ сделать это без включения поля? данные по умолчанию при отображении индекса. Так как это займет большую кучу памяти, и я уже загрузил огромные данные без нее

отображение документа

{
  "mappings": {
    "properties": {
      "productname": {
        "type": "nested",
        "properties": {
          "productlineseqno": {
            "type": "text"
          },
          "invoiceitemname": {
            "type": "text"
          },
          "productlinename": {
            "type": "text"
          },
          "productlinedescription": {
            "type": "text"
          },
          "isprescribable": {
            "type": "boolean"
          },
          "iscontrolleddrug": {
            "type": "boolean"
          }
        }
      }

образец документа

{
  "productname": [
    {
      "productlineseqno": "1.58",
      "iscontrolleddrug": "false",
      "productlinename": "Consultations",
      "productlinedescription": "Consultations",
      "isprescribable": "false",
      "invoiceitemname": "invoice name"
    }
  ]
}

Исправлено

Изменяя отображение для включения данных поля

1 Ответ

1 голос
/ 29 апреля 2020

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

{
  "aggs": {
    "fieldname": {
      "nested": {
        "path": "objectField"
      },
      "aggs": {
        "fields": {
          "terms": {
            "field": "objectField.fieldname.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

EDIT1:

Если вы ищете название продукта .invoiceitemname.keyword, тогда он даст пустую корзину, так как с таким именем не существует поля.

Вам необходимо определить свое отображение, как показано ниже

{
  "mappings": {
    "properties": {
      "productname": {
        "type": "nested",
        "properties": {
          "productlineseqno": {
            "type": "text"
          },
          "invoiceitemname": {
            "type": "text",
            "fields":{       --> note
              "keyword":{
                "type":"keyword"
              }
            }
          },
          "productlinename": {
            "type": "text"
          },
          "productlinedescription": {
            "type": "text"
          },
          "isprescribable": {
            "type": "boolean"
          },
          "iscontrolleddrug": {
            "type": "boolean"
          }
        }
      }
    }
  }
}

Поля

Часто бывает полезно индексировать одно и то же поле по-разному для разных целей. Это цель мультиполя. Например, строковое поле может быть отображено как текстовое поле для полнотекстового поиска и как поле ключевого слова для сортировки или агрегации:

Когда отображение явно не предусмотрено, поля ключевых слов создаются дефолт. Если вы создаете свое собственное сопоставление (что необходимо сделать для вложенного типа), вам необходимо предоставить поля ключевых слов в сопоставлении, где бы вы ни собирались их использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...