Я хочу объединить данные, имеющие внутренние объекты. Например:ElasticSearch 1x - агрегат по объектным условиям
{
"_index": "product_index-en",
"_type": "elasticproductmodel",
"_id": "000001111",
"_score": 6.3316255,
"_source": {
"productId": "11111111111",
"productIdOnlyLetterAndDigit": "11111111111",
"productIdOnlyDigit": "11111111111",
"productNumber": "11111111111",
"name": "Glow Plug",
"nameOnlyLetterAndDigit": "glowplug",
"productImageLarge": "11111111111.jpg",
"itemGroupId": "11111",
"relatedProductIds": [],
"dataAreaCountries": [
"fra",
"pol",
"uk",
"sie",
"sve",
"atl",
"ita",
"hol",
"dk"
],
"oemItems": [
{
"manufactorName": "BERU",
"manufacType": "0"
},
{
"manufactorName": "LUCAS",
"manufacType": "0"
}
]
}
}
мне нужно, чтобы иметь возможность заполнители значения oemItems.manufactorName, но только там, где oemItems.manufacType является «0». Я попробовал несколько примеров, таких как принятый здесь (Elastic Search Aggregate into buckets on conditions), но я просто не могу обернуть вокруг себя голову.
Я пробовал следовать, надеясь, что он сначала начнет aggragate на manufacType, что он и делает, а затем manufactorName для каждого типа, который, по-видимому, отображает правильное количество попаданий. Однако, ковши для manufactorName пустуют:
GET /product_index-en/_search
{
"size": 0,
"aggs": {
"baked_goods": {
"nested": {
"path": "oemItems"
},
"aggs": {
"test1": {
"terms": {
"field": "oemItems.manufacType",
"size": 500
},
"aggs": {
"test2": {
"terms": {
"field": "oemItems.manufactorName",
"size": 500
}
}
}
}
}
}
}
}
И результат:
{
"took": 27,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 471214,
"max_score": 0,
"hits": []
},
"aggregations": {
"baked_goods": {
"doc_count": 677246,
"test1": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "0",
"doc_count": 436557,
"test2": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
},
{
"key": "1",
"doc_count": 240689,
"test2": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
]
}
}
}
}
Я также попытался добавить вложенную термин фильтр, чтобы только посмотреть на oemItems, которые имеют manufacType 1 с помощью следующего запроса. Однако он возвращает объекты, в которых oemItems включает manufacType 1, что означает, что oemItems внутри продуктов по-прежнему содержит 1 или 0 manufacType. Я не вижу, как делают агрегат на этот ответ будет возвращать только oemItems.manufactorName где oemItems.manufacType находится 0
GET /product_index-en/_search
{
"query" : { "match_all" : {} },
"filter" : {
"nested" : {
"path" : "oemItems",
"filter" : {
"bool" : {
"must" : [
{
"term" : {"oemItems.manufacType" : "1"}
}
]
}
}
}
}
}
Во-первых, вам нужно убедиться, что 'oemItems' имеет тип« вложенный »в вашем сопоставлении. Это так? – Val
@Val Нет, это не вложенный тип. Я изменю его и посмотрю, поможет ли это. –
@Val Я установил его вложенное и добавил пример в свой пост. –