从多个条件的Elasticsearch获取数据

时间:2016-12-13 13:16:51

标签: php elasticsearch

以下是我在弹性搜索实例中编制索引的示例产品(2)数据。

[{
    "type": "mobile",
    "name": "iPhone 7s",
    "price": 70000,
    "brand_id": "100",
    "spec": [{
        "id": 200,          // brand id
        "value": "apple"
    }, {
        "id": 201,          // color id
        "value": "black"
    }, {
        "id": 202,          // battery size id
        "value": "2200"
    }]
}, {
    "type": "mobile",
    "name": "Samsung Galaxy 5S",
    "price": 50000,
    "brand_id": "101",
    "spec": [{
        "id": 200,
        "value": "samsung"
    }, {
        "id": 201,
        "value": "silver"
    }, {
        "id": 202,
        "value": "3200"
    }]
}]

我想要做的是,获取所有手机数据,其中'品牌'将是' samsung' &安培; '颜色'等于'银'。

我使用PHP与Elasticsearch进行通信。这是一个示例PHP脚本,它将返回所有' samsung'弹性手机。

$params = [
            'index' => 'index name',
            'type' => 'products',
            'from' => $start,
            'size' => $limit,
            'body' => [
                'query' => [
                    'bool' => [
                        'must' => [
                            'match' => [
                                'type' => 'mobile'
                            ]
                        ],
                        [
                            'nested' => [
                                'path' => "spec",
                                "score_mode" => "max",
                                'query' => [
                                    'bool' => [
                                        'must' => [
                                            [
                                                'match' => [
                                                    "spec.id"  => 200
                                                ]
                                            ],
                                            [
                                                'match' => [
                                                    "spec.value"  => 'samsung'
                                                ]
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ];

$result = $client->search($params);

但是,我无法理解如何在“颜色”中加入条件。场也。所以,我可以得到所有'三星'手机有黑色'只有颜色。

1 个答案:

答案 0 :(得分:1)

由于您的spec字段已正确映射为nested字段,因此您只需修改此查询(即将nested查询移到bool/must字段内并为颜色约束创建另一个):

$params = [
            'index' => 'index name',
            'type' => 'products',
            'from' => $start,
            'size' => $limit,
            'body' => [
                'query' => [
                    'bool' => [
                        'must' => [
                          [
                            'match' => [
                                'type' => 'mobile'
                            ]
                          ],
                          [
                            'nested' => [
                                'path' => "spec",
                                "score_mode" => "max",
                                'query' => [
                                    'bool' => [
                                        'must' => [
                                            [
                                                'match' => [
                                                    "spec.id"  => 200
                                                ]
                                            ],
                                            [
                                                'match' => [
                                                    "spec.value"  => 'samsung'
                                                ]
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                          ],
                          [
                            'nested' => [
                                'path' => "spec",
                                "score_mode" => "max",
                                'query' => [
                                    'bool' => [
                                        'must' => [
                                            [
                                                'match' => [
                                                    "spec.id"  => 201
                                                ]
                                            ],
                                            [
                                                'match' => [
                                                    "spec.value"  => 'black'
                                                ]
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                          ],
                       ]
                    ]
                ]
            ]
        ];

$result = $client->search($params);