Elasticsearch PHP 将路由添加到子文档
Elasticsearch PHP add routing to child document
数据库服务器:
弹性搜索 7.9.2
Centos 7.7
开发环境:
PHP 7.3.11
MacOS
我是 Elasticsearch 的新手,所以请多多包涵。
不过这让我发疯。
我正在尝试做一些非常简单的事情,但是由于我来自关系数据库领域,所以我需要动脑筋。我创建了一个具有父子关系的映射。
Product --> Price
这是我创建的映射:
PUT /products_pc
{
"mappings": {
"properties": {
"datafeed_id": {
"type": "integer"
},
"date_add": {
"type": "date"
},
"description": {
"type": "text"
},
"ean": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"image_url": {
"type": "text",
"index": false
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"sku": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"webshop_id": {
"type": "integer"
},
"price": {
"type": "float"
},
"url": {
"type": "text"
},
"date_mod":{
"type": "date"
},
"product_price" : {
"type":"join",
"relations": {
"product":"price"
}
}
}
}
}
到目前为止一切顺利。当我手动添加一个产品和 2 个价格时,我可以得到我所期望的:1 个父文档和 2 个子文档。
现在进入 PHP,我可以为父文档编制索引,但不能为子文档编制索引。看起来我无法发送路由参数(我可以使用 Kibana)
这是我在PHP中试过的,parent _id = 123
$hosts = ['xxx.xxx.xxx.xxx:9200'];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
$params['body'][] = [
'create' => [
'_index' => 'products_pc',
'_id' => '123_1'
]
];
$params['body'][] = [
'webshop_id' => 1,
'date_mod' => time(),
'price' => 12,
'url' => '',
'product_price' => [
'name' => 'price',
'parent' => 123
]
];
$client->bulk($params);
但这不起作用,因为没有设置路由。如果我在 _id 字段下方添加 '_routing' => 123,我会收到 400 错误,告诉我 _routing 字段错误(“Action/metadata 行 [3] 包含未知参数 [_routing]”)
找了2天了,运行转了一圈。所有不同的 Elasticsearch 版本都略有不同,所以我不得不承认我迷路了。有没有人可以指出我的错误?还是正确方向的提示?这让我发疯。 (怕做起来太简单了...)
提前致谢!
所以我们在这里,经过 2 天的搜索...但我似乎找到了解决方案...
经过几个小时的搜索,我再次来到了这个页面:
https://elastic.co/guide/en/elasticsearch/client/php-api/current/ElasticsearchPHP_Endpoints.html#Elasticsearch_Clientbulk_bulk
它就在批量端点的参数列表中:
$params['routing'] = // (string) Specific routing value
起初不太确定如何使用它,但是...
然后我对每个子文档都尝试了这个,这似乎可以解决问题![=14=]
$hosts = ['xxx.xxx.xxx.xxx:9200'];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
// insert price
$params['body'][] = [
'index' => [
'_index' => 'products_pc',
'_id' => '123_1',
'routing' => 123 // <-- Insert routing here.
]
];
$params['body'][] = [
'webshop_id' => 1,
'date_mod' => time(),
'price' => 12,
'url' => '',
'product_price' => [
'name' => 'price',
'parent' => 123 // <-- Parent _id value
]
];
$client->bulk($params);
和之前想的一样,其实太简单了。但我想这就是程序员的生活吧。
不过请注意,很多文档都提到了 _routing 字段(甚至 7.9 版的官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/mapping-routing-field.html 正如在元数据字段下的右侧子菜单中的文本中所见)但是该字段实际上只是“路由”。可能会为您节省几天时间 ;-)
数据库服务器: 弹性搜索 7.9.2 Centos 7.7
开发环境: PHP 7.3.11 MacOS
我是 Elasticsearch 的新手,所以请多多包涵。 不过这让我发疯。
我正在尝试做一些非常简单的事情,但是由于我来自关系数据库领域,所以我需要动脑筋。我创建了一个具有父子关系的映射。
Product --> Price
这是我创建的映射:
PUT /products_pc
{
"mappings": {
"properties": {
"datafeed_id": {
"type": "integer"
},
"date_add": {
"type": "date"
},
"description": {
"type": "text"
},
"ean": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"image_url": {
"type": "text",
"index": false
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"sku": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"webshop_id": {
"type": "integer"
},
"price": {
"type": "float"
},
"url": {
"type": "text"
},
"date_mod":{
"type": "date"
},
"product_price" : {
"type":"join",
"relations": {
"product":"price"
}
}
}
}
}
到目前为止一切顺利。当我手动添加一个产品和 2 个价格时,我可以得到我所期望的:1 个父文档和 2 个子文档。
现在进入 PHP,我可以为父文档编制索引,但不能为子文档编制索引。看起来我无法发送路由参数(我可以使用 Kibana)
这是我在PHP中试过的,parent _id = 123
$hosts = ['xxx.xxx.xxx.xxx:9200'];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
$params['body'][] = [
'create' => [
'_index' => 'products_pc',
'_id' => '123_1'
]
];
$params['body'][] = [
'webshop_id' => 1,
'date_mod' => time(),
'price' => 12,
'url' => '',
'product_price' => [
'name' => 'price',
'parent' => 123
]
];
$client->bulk($params);
但这不起作用,因为没有设置路由。如果我在 _id 字段下方添加 '_routing' => 123,我会收到 400 错误,告诉我 _routing 字段错误(“Action/metadata 行 [3] 包含未知参数 [_routing]”)
找了2天了,运行转了一圈。所有不同的 Elasticsearch 版本都略有不同,所以我不得不承认我迷路了。有没有人可以指出我的错误?还是正确方向的提示?这让我发疯。 (怕做起来太简单了...)
提前致谢!
所以我们在这里,经过 2 天的搜索...但我似乎找到了解决方案...
经过几个小时的搜索,我再次来到了这个页面: https://elastic.co/guide/en/elasticsearch/client/php-api/current/ElasticsearchPHP_Endpoints.html#Elasticsearch_Clientbulk_bulk
它就在批量端点的参数列表中:
$params['routing'] = // (string) Specific routing value
起初不太确定如何使用它,但是... 然后我对每个子文档都尝试了这个,这似乎可以解决问题![=14=]
$hosts = ['xxx.xxx.xxx.xxx:9200'];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
// insert price
$params['body'][] = [
'index' => [
'_index' => 'products_pc',
'_id' => '123_1',
'routing' => 123 // <-- Insert routing here.
]
];
$params['body'][] = [
'webshop_id' => 1,
'date_mod' => time(),
'price' => 12,
'url' => '',
'product_price' => [
'name' => 'price',
'parent' => 123 // <-- Parent _id value
]
];
$client->bulk($params);
和之前想的一样,其实太简单了。但我想这就是程序员的生活吧。
不过请注意,很多文档都提到了 _routing 字段(甚至 7.9 版的官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/mapping-routing-field.html 正如在元数据字段下的右侧子菜单中的文本中所见)但是该字段实际上只是“路由”。可能会为您节省几天时间 ;-)