Php 使用多个条件从Elasticsearch获取数据
下面是我在elasticsearch实例中索引的示例产品(2)数据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
[{
"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);