elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

Php 使用多个条件从Elasticsearch获取数据

Php 使用多个条件从Elasticsearch获取数据,php,elasticsearch,Php,elasticsearch,下面是我在elasticsearch实例中索引的示例产品(2)数据 [{ "type": "mobile", "name": "iPhone 7s", "price": 70000, "brand_id": "100", "spec": [{ "id": 200, // brand id "value": "apple" }, { "id": 201, // col

下面是我在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"
    }]
}]
我想做的是,获取所有手机数据,其中“品牌”将是“三星”,而“颜色”等于“银”

我正在使用PHP与Elasticsearch进行通信。下面是一个示例PHP脚本,它将从elastic返回所有“三星”手机

$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);

但是,我无法理解如何也包括“颜色”字段的条件。因此,我可以让所有的“三星”手机只使用“黑色”颜色。

由于您的
spec
字段正确映射为
嵌套的
字段,您只需像这样修改查询(即将
嵌套的
查询移动到
bool/must
中,然后为颜色约束创建另一个查询):


首先,您需要确保
spec
字段为。是这样吗?我在映射索引时已经做过了。哇!!!它起作用了。再次非常感谢你帮助我。现在我可以从这里开始了。很高兴它起了作用!
$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);