У меня есть следующий фильтр:Фильтра по товарам и показывая доступные варианты использование Elasticsearch
Как вы можете видеть здесь, у меня есть атрибуты (выше каждая горизонтальная линии) и все существующих значения для этих атрибутов (ниже каждой горизонтальной линии).
Серверные данные из формы: ["X"=>['1','2', ...], "Y"=>['11','22', ...]]
где X, Y = идентификаторы атрибутов. 1,2,11,22 = ids значений.
Мой вариант запроса:
http://sense.qbox.io/gist/821b25abc1aa4720942a2d9cc7d759bdaee447a9 (Mapping там тоже). Но это работает странно. Агрегирование работает не с отфильтрованными данными.
Мне нужно фильтровать товары и показывать количество доступных параметров для каждого значения. Как это сделать? Теперь, когда я проверяю некоторые значения, я получаю И, И, И (данные суммируются). Количество окончательного набора данных только увеличивается.
Edit:
Мне нужно, чтобы иметь возможность выбрать несколько значений из каждого атрибута, и мне нужно, чтобы получить данные для каждого значения. Когда я выбираю 1 значение из одного атрибута и одно значение из другого, мне нужно получить документы, которые соответствуют значению 1 И 2. Когда я выбираю несколько значений из одного атрибута и нескольких значений из другого, мне нужно получить хотя бы одно значение пары (attribute1) и value (attribute2). Также мне нужно показать количество доступных опций для всех значений.
Я написал (и это работает):
$query = [
"query" => [
"filtered"=> [
"filter" => [
"nested"=> [
"path"=> "individual_attributes",
"filter"=> [
"bool"=> [
"must"=> [
$nested
]
]
]
]
]
]
],
"aggs"=> [
"individual_attributes"=> [
"nested"=> ["path"=> "individual_attributes"],
"aggs"=> [
"attributes_set"=> [
"nested"=> [
"path"=> "individual_attributes.attributes_set"
],
"aggs"=> [
"attributes"=> [
"terms"=> [
"field"=> "individual_attributes.attributes_set.attribute_value"
]
]
]
]
]
]
]
];
$ вложенного идентификатор ($params = ["X"=>['1','2', ...], "Y"=>['11','22', ...]]
):
foreach($params as $k => $v){
foreach ($v as $sub)
{
$nested[] = [
"nested" => [
"path" => "individual_attributes.attributes_set",
"filter" => [
"bool" => [
"must" => [
[
"term" => [
"individual_attributes.attributes_set.attribute_id" => [
"value" => $k
]
]
],
[
"term" => [
"individual_attributes.attributes_set.attribute_value" => [
"value" => $sub
]
]
]
]
]
]
]
];
}
}
отлично работает. Но я не могу выбрать несколько значений из одного атрибута.
Эта часть не ясна: «Теперь, когда я проверяю некоторые значения, я получаю И, И, И» Можете ли вы прояснить и, возможно, показать некоторые примеры документов и то, что вы ожидаете в своих результатах, так что людям легче воссоздать проблему ? – Val