使用Elasticsearch过滤商品并显示可用选项

时间:2015-10-27 20:41:40

标签: elasticsearch faceted-search

我有以下过滤器:

enter image description here

正如你在这里看到的,我有属性(在每个水平线上方)和这些属性的所有现有值(在每个水平线下面)。

来自以下形式的服务器传入数据:["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
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ];
    }
}

完美无缺。但是我不能从一个属性中选择几个值。

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用三种过滤器。根据文档,这里是对这三个的解释: 1.)过滤查询:

  

过滤后的查询用于将另一个查询与任何过滤器组合在一起。   在筛选的查询中,过滤器会减少文档的数量      可以通过查询进行匹配(和评分)。

2.)常量得分查询:

  

包装过滤器或其他查询的查询,只返回一个   常数得分等于对每个文档的查询提升   过滤

“constant_score”查询说“所有文档都相同”,所以没有得分    必须发生 - 只需应用过滤器

3.。)过滤后:

  

post_filter应用于搜索结果的最后一个   搜索请求,已经计算了聚合。

这意味着在计算聚合后,过滤器将应用于搜索结果。您将获得的匹配只会被过滤而不是聚合结果。

因此,后过滤器聚合结果不计算过滤器,其中常量分数和过滤查询确实已经过滤了聚合结果。如果您实际上对结果的分数不感兴趣并且只需要聚合值,请尝试以恒定分数包装查询/过滤器。

希望这有帮助。