我在Elasticsearch中阅读了关于索引文档的tutorial。 有批量索引的示例。我有疑问,在循环中为一个项目创建带有两个键的数组时是否正确:
for($i = 0; $i < 100; $i++) {
$params['body'][] = array(
'index' => array(
'_id' => $i
)
);
$params['body'][] = array(
'my_field' => 'my_value',
'second_field' => 'some more values'
);
}
为什么循环中有两个数组$params['body'][]
的初始化?
必须使用与my_field
相同的键设置索引吗?
我的意思是一种情况,当有关索引的所有信息都被一个键(索引)添加到数组中时:
$params['body'][] = array(
'index' => array(
'_id' => $i
),
'my_field' => 'my_value',
'second_field' => 'some more values'
);
搜索查询后,我收到错误:
消息:非法字符串偏移&#39;匹配&#39;在哪里:
$query['match']['name'] = $query;
其中$query
是字符串。
我认为这个错误在创建索引时存在问题,因此我已经开始使用它了。
我在代码中添加文档的代码:
private function addDocument($data = array(), $type)
{
if (!empty($data)) {
foreach ($data as $key => $val) {
$params['body'][] = array(
'index' => array(
'_id' => $key,
'_type' => 'profiles',
'_index' => $this->_typeIndex($type)
)
);
$params['body'][] = (array)$val;
}
$this->client->bulk($params);
}
}
是不是?因为在搜索中我得到错误,这里描述
答案 0 :(得分:4)
为了使批量索引工作,有效负载必须包含每个文档的一个命令(索引,类型,文档的id)行和一个内容行(文档的实际字段),如下所示:
{"index": {"_id": "1234"}} <--- command for doc1
{"field1": "value1", "field2": "value2"} <--- source for doc1
{"index": {"_id": "1234"}} <--- command for doc2
{"field1": "value1", "field2": "value2"} <--- source for doc2
...
您引用的PHP示例正是如此:
$params['body'][] = array(
'index' => array(
'_id' => $i
)
);
将创建第一个读取{"index": {"_id": "0"}}
的命令行
和
$params['body'][] = array(
'my_field' => 'my_value',
'second_field' => 'some more values'
);
将创建阅读{"my_field": "my_value", "second_field": "some more values"}
for循环执行此操作100x,并将为100个文档创建包含200行的有效内容。
如果你像使用
一样连接身体$params['body'][] = array(
'index' => array(
'_id' => $i
),
'my_field' => 'my_value',
'second_field' => 'some more values'
);
它不起作用,因为每个文档会产生一行,如下所示:
{"index":{"_id": "0"}, "my_field": "my_value", "second_field": "some more values"}
批量操作将失败......
再试一次。
<强>更新强>
它无法正常工作,因为您添加了太多行。您应该删除foreach
并按照这样做。我不确定你的id
字段是如何调用的。另外我想$data
数组包含要添加的文档的字段。
private function addDocument($data = array(), $type)
{
if (!empty($data)) {
$params['body'][] = array(
'index' => array(
'_id' => $data['id'], <--- make sure to use the right id field
'_type' => 'profiles',
'_index' => $this->_typeIndex($type)
)
);
$params['body'][] = $data;
$this->client->bulk($params);
}
}