Как выполнить агрегацию вложенных объектов — Elasticsearch

Я новичок в Elasticsearch, поэтому, пожалуйста, потерпите меня. Это часть моего документа в ES.

{
  "source": {
    "detail": {
      "attribute": {
        "Size": ["32 Gb",4],
        "Type": ["Tools",4],
        "Brand": ["Sandisk",4],
        "Color": ["Black",4],
        "Model": ["Sdcz36-032g-b35",4],
        "Manufacturer": ["Sandisk",4]
      }
    },
    "title": {
      "list": [
        "Sandisk Cruzer 32gb Usb 32 Gb Flash Drive , Black - Sdcz36-032g"
      ]
    }
  }
}

Итак, чего я хочу добиться, так это найти три лучших или три лучших совпадения объекта атрибута. Например, если я выполняю поиск по запросу «sandisk», я хочу получить три атрибута, например ["Size", "Color", "Model"], или любые другие атрибуты на основе агрегации лучших результатов. Итак, я сделал такой запрос

{
  "size": 0,
  "aggs": {
    "categoryList": {
      "filter": {
        "bool": {
          "filter": [
            {
              "term": {
                "title.list": "sandisk"
              }
            }
          ]
        }
      },
      "aggs": {
        "results": {
          "terms": {
            "field": "detail.attribute",
            "size": 3
          }
        }
      }
    }
  }
}

Но, похоже, это не работает. Как это исправить? Любые подсказки будут высоко оценены.

Это _mappings. Он не полный, но, думаю, этого будет достаточно.

{
  "catalog2_0": {
    "mappings": {
      "product": {
        "dynamic": "strict",
        "dynamic_templates": [
          {
            "attributes": {
              "path_match": "detail.attribute.*",
              "mapping": {
                "type": "text"
              }
            }
          }
        ],
        "properties": {

          "detail": {
            "properties": {
              "attMaxScore": {
                "type": "scaled_float",
                "scaling_factor": 100
              },
              "attribute": {
                "dynamic": "true",
                "properties": {
                  "Brand": {
                    "type": "text"
                  },
                  "Color": {
                    "type": "text"
                  },
                  "MPN": {
                    "type": "text"
                  },
                  "Manufacturer": {
                    "type": "text"
                  },
                  "Model": {
                    "type": "text"
                  },
                  "Operating System": {
                    "type": "text"
                  },
                  "Size": {
                    "type": "text"
                  },
                  "Type": {
                    "type": "text"
                  }
                }
              },
              "description": {
                "type": "text"
              },
              "feature": {
                "type": "text"
              },
              "tag": {
                "type": "text",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              }
            }
          },

          "title": {
            "properties": {

              "en": {
                "type": "text"
              }
            }
          }
        }
      }
    }
  }
}

person anoop chandran    schedule 17.04.2018    source источник
comment
не могли бы вы опубликовать свое отображение индекса? ПОЛУЧИТЬ ‹your_index_name›/_mappings   -  person Lupanoide    schedule 17.04.2018
comment
@Lupanoide Я добавил отображение индекса к вопросу. Пожалуйста найдите. Благодарю вас   -  person anoop chandran    schedule 17.04.2018
comment
нет сопоставления для title.list ??? Он имеет текстовый или ключевой тип данных?   -  person Lupanoide    schedule 17.04.2018


Ответы (2)


  • Согласно документации вы не можете выполнять агрегацию по полю с типом данных text. Они должны иметь тип данных keyword.

  • Тогда вы не можете выполнить агрегацию по полю detail.attribute таким образом: поле detail.attribute не хранит никакого значения: это тип данных object, а не nested, как вы написали в вопросе, это означает, что это контейнер для другого поля, такого как Size, Brand и т. д. Таким образом, вы должны агрегировать с полем detail.attribute.Size - например, если это был тип данных keyword.

  • Другая возможная ошибка заключается в том, что вы пытаетесь выполнить запрос term для типа данных text — какой тип данных у поля title.list? Term запрос является прерогативой для поля с keyword типом данных, а match запрос используется для запроса к text типу данных

person Lupanoide    schedule 17.04.2018

Вот что я использовал для вложенного запроса aggs, за вычетом фактических имен значений. Фактическим полем является ключевое слово, которое, как уже упоминалось, является обязательным и является частью вложенного объекта JSON:

"STATUS_ID": {
                "type": "keyword",
                "index": "not_analyzed",
                "doc_values": true
              },

Запрос

  GET index name/_search?size=200
    {
      "aggs": {
        "panels": {
          "nested": {
            "path": "nested path"
          },
          "aggs": {
            "statusCodes": {
              "terms": {
                "field": "nested path.STATUS.STATUS_ID",
                "size": 50
              }
            }
          }
        }
      }
    }

Результат

"aggregations": {
    "status": {
      "doc_count": 12108963,
      "statusCodes": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "O",
            "doc_count": 5912218
          },
          {
            "key": "C",
            "doc_count": 401586
          },
          {
            "key": "E",
            "doc_count": 135628
          },
          {
            "key": "Y",
            "doc_count": 3742
          },
          {
            "key": "N",
            "doc_count": 1012
          },
          {
            "key": "L",
            "doc_count": 719
          },
          {
            "key": "R",
            "doc_count": 243
          },
          {
            "key": "H",
            "doc_count": 86
          }
        ]
      }
    }
person James Drinkard    schedule 17.04.2018