ElasticSearch Фильтрация с вложенным агрегированием - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать подобный электронной коммерции поисковый фильтр на основе меток / фасетов.Мои ярлыки динамически создаются и индексируются следующим образом:

{
  "products": {
    "properties": {
      "name": {
        "type": "text"
      },
      "labels": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "keyword"
          },
          "typeId": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

Я хочу выполнять поиск, как и все другие веб-сайты электронной коммерции, по типу ярлыка (например, по размеру экрана), операции ИЛИ, а между типами ярлыков - операции И,Я могу сделать это с помощью следующего запроса:

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "labels.id": [
              "45inch",
              "50inch"
            ]
          }
        },
         {
          "terms": {
            "labels.id": [
              "plasma",
              "led"
            ]
          }
        }
      ]
    }
  }
}

Теперь я хочу агрегацию меток, при добавлении простой агрегации все выглядит хорошо, но это не потому, что я пропускаю значения: каждая агрегация должна рассчитывать нанабор данных со всеми примененными фильтрами, кроме собственного (подробнее: https://madewithlove.be/faceted-search-using-elasticsearch/ последняя часть).Это самая основная рабочая агрегация, но отфильтрованная (применяется фильтр запросов):

 "aggs": {
    "productLabels": {
      "nested": {
        "path": "labels"
      },
      "aggs": {
        "innerAggregation": {
          "terms": {
            "field": "labels.typeId"
          },
          "aggs": {
            "name": {
              "terms": {
                "field": "labels.id"
              }
            }
          }
        }
      }
    }
  }
}

Так что мне нужно глобальное агрегирование с некоторыми фильтрами, мне нужна некоторая помощь для фильтрации агрегации, кроме его собственной.У меня уже есть это, но это не правильно, потому что теперь он фильтрует все типы меток со всеми подгонщиками (включая его собственный):

 "aggs": {
    "allLabels": {
      "global": {},
      "aggs": {
        "filteredLabels": {
          "filter": {
            "bool": {
              "must": [
                {
                  "terms": {
                    "labels.id": [
                      "45inch",
                      "50inch"
                    ]
                  }
                },
                {
                  "terms": {
                    "labels.id": [
                      "plasma",
                      "led"
                    ]
                  }
                }
              ]
            }
          },
          "aggs": {
            "nestedLabels": {
              "nested": {
                "path": "labels"
              },
              "aggs": {
                "labels": {
                  "terms": {
                    "field": "labels.typeId"
                  },
                  "aggs": {
                    "name": {
                      "terms": {
                        "field": "labels.id"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

Кто-нибудь знает, как этого добиться?

Большое спасибо!

...