Получить все ведра для совокупного эласта c поиска - PullRequest
0 голосов
/ 30 января 2020

Я хочу получить все сегменты, доступные для определенного агрегата. Есть ли какой-либо запрос или конечная точка, чтобы получить ведра? Ниже мое отображение. Если я запрашиваю какой-либо фильтр, то появляются соответствующие сегменты, но я хочу, чтобы все сегменты отображали его на внешнем интерфейсе или выполняли операции. Пример: если у нас есть 2 записи, одна с категорией в качестве председателя, а другая в таблице. Если я выбираю стул, он возвращает количество столов, равное нулю, но оно должно отображаться как количество столов как 1. Таким образом, пользователь может выбрать оба.

MyMapping:

{
"properties": {
  "australiasellable": {
    "type": "boolean"
  },
  "avgRating": {
    "type": "float"
  },
  "categories": {
    "type": "nested"
  },
  "category": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "categorycode": {
    "type": "text",
    "fielddata": true
  },
  "categoryname": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "colour": {
    "type": "text",
    "fielddata": true
  },
  "commercialuse": {
    "type": "boolean"
  },
  "customisable": {
    "type": "boolean"
  },
  "depth": {
    "type": "float"
  },
  "freedelivery": {
    "type": "boolean"
  },
  "height": {
    "type": "float"
  },
  "listprice": {
    "type": "float"
  },
  "location": {
    "type": "geo_point"
  },
  "material": {
    "type": "text",
    "fielddata": true
  },
  "materialcode": {
    "type": "text",
    "fielddata": true
  },
  "message": {
    "type": "geo_point"
  },
  "numberOfRating": {
    "type": "long"
  },
  "online": {
    "type": "boolean"
  },
  "outdooruse": {
    "type": "boolean"
  },
  "productid": {
    "type": "long"
  },
  "productimageurl": {
    "type": "text",
    "fielddata": true
  },
  "productname": {
    "type": "text",
    "fielddata": true
  },
  "producttypecode": {
    "type": "text",
    "fielddata": true
  },
  "sellercode": {
    "type": "text",
    "fielddata": true
  },
  "sellerdescription": {
    "type": "text",
    "fielddata": true
  },
  "shortdescription": {
    "type": "text",
    "fielddata": true
  },
  "sku": {
    "type": "text",
    "fielddata": true
  },
  "state": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "stylecode": {
    "type": "text",
    "fielddata": true
  },
  "warrantycode": {
    "type": "text",
    "fielddata": true
  },
  "weight": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },
  "width": {
    "type": "float"
  }
}

}

С уважением, Сринивас

1 Ответ

0 голосов
/ 01 февраля 2020

Возможным решением было бы не установить фильтр в разделе query вашей полезной нагрузки, а выполнить отфильтрованные агрегации и использовать top_hits, чтобы получить _source из соответствующих документов.

Короче говоря, если вы примените query, это, конечно, повлияет на ваши агрегации. Таким образом, хитрость заключается в том, чтобы не применять какой-либо запрос (либо match_all, либо удалить весь объект query) и выполнять запросы в подгруппах следующим образом:

Использование поля category:

GET your_index/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "actual_query_agg": {
      "filter": {
        "term": {
          "category.keyword": {
            "value": "chair"
          }
        }
      },
      "aggs": {
        "actual_query_agg_top_hits": {
          "top_hits": {
            "_source": [
              "category"
            ],
            "size": 10
          }
        }
      }
    },
    "excluding_my_query_filtered_agg": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "category.keyword": "chair"
            }
          }
        }
      },
      "aggs": {
        "by_other_categories_agg": {
          "terms": {
            "field": "category.keyword",
            "size": 10
          },
          "aggs": {
            "categorized_other_docs_agg_top_hits": {
              "top_hits": {
                "_source": [
                  "category"
                ],
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

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

GET your_index/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "actual_query_agg": {
      "filter": {
        "term": {
          "category.keyword": {
            "value": "chair"
          }
        }
      }
    },
    "excluding_my_query_filtered_agg": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "category.keyword": "chair"
            }
          }
        }
      },
      "aggs": {
        "by_other_categories_agg": {
          "terms": {
            "field": "category.keyword",
            "size": 10
          }
        }
      }
    }
  }
}
...