PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php-在elasticsearch示例中建立索引?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我读了tutorial关于在Elasticsearch中建立文档索引.
有批量索引的示例.我有一个问题,在循环中为一个项目用两个键创建数组时是否正确:

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

另外搜索查询后,我得到错误

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

    }

这样对吗?因为在搜索中出现错误,所以这里描述了

解决方法:

为了使批量索引工作,有效负载必须每个文档包含一个命令(索引,类型,文档的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”:“更多值”}

for循环执行此操作100倍,并将创建一个有效负载,其中包含200行用于100个文档.

如果像您那样连接身体

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

大佬总结

以上是大佬教程为你收集整理的php-在elasticsearch示例中建立索引?全部内容,希望文章能够帮你解决php-在elasticsearch示例中建立索引?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: