我有以下过滤器:
正如你在这里看到的,我有属性(在每个水平线上方)和这些属性的所有现有值(在每个水平线下面)。
来自以下形式的服务器传入数据:["X"=>['1','2', ...], "Y"=>['11','22', ...]]
其中X,Y =属性ID。 1,2,11,22 =值的ID。
我的查询变体是:
http://sense.qbox.io/gist/821b25abc1aa4720942a2d9cc7d759bdaee447a9 (映射也在那里)。但它很奇怪。聚合不适用于过滤后的数据。
我需要过滤商品并显示每个值的可用选项数量。怎么做?现在,当我检查一些值时,我得到And,And,And(数据汇总)。最终数据集的数量正在增加。
编辑:
我需要有可能从每个属性中选择几个值,我需要为每个值获取数据。当我从一个属性中选择1个值而从另一个属性中选择一个值时,我需要获取与1和2值匹配的文档。当我从一个属性中选择多个值而从另一个属性中选择多个值时,我需要至少获得一对值(attribute1)和值(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"
]
]
]
]
]
]
]
];
$ nested id($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
]
]
]
]
]
]
]
];
}
}
完美无缺。但是我不能从一个属性中选择几个值。
答案 0 :(得分:0)
您可以使用三种过滤器。根据文档,这里是对这三个的解释: 1.)过滤查询:
过滤后的查询用于将另一个查询与任何过滤器组合在一起。 在筛选的查询中,过滤器会减少文档的数量 可以通过查询进行匹配(和评分)。
2.)常量得分查询:
包装过滤器或其他查询的查询,只返回一个 常数得分等于对每个文档的查询提升 过滤
“constant_score”查询说“所有文档都相同”,所以没有得分 必须发生 - 只需应用过滤器
3.。)过滤后:
post_filter应用于搜索结果的最后一个 搜索请求,已经计算了聚合。
这意味着在计算聚合后,过滤器将应用于搜索结果。您将获得的匹配只会被过滤而不是聚合结果。
因此,后过滤器聚合结果不计算过滤器,其中常量分数和过滤查询确实已经过滤了聚合结果。如果您实际上对结果的分数不感兴趣并且只需要聚合值,请尝试以恒定分数包装查询/过滤器。
希望这有帮助。