一架梯子,一头程序猿,仰望星空!

php elasticsearch 文档操作(CRUD)


Elasticsearch文档的基础操作主要包括:创建、查询、更新、删除、批量查询、批量更新、批量删除。

下面介绍php对elasticsearch文档的基础操作

创建文档

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id', // 设置文档Id, 可以忽略Id, Es也会自动生成
    'body'  => [ 'testField' => 'abc'] // 设置文档内容
];

// 创建文档
$response = $client->index($params);

bulk批量创建文档

通过bulk实现批量插入文档,bulk操作,都是一行操作说明,一行操作相关数据的方式进行组织内容。

// 循环插入100条数据
for($i = 0; $i < 100; $i++) {
    // bulk操作,先拼接一行index操作参数
    $params['body'][] = [
        'index' => [
            '_index' => 'my_index', // 索引名
            'id'    => 'my_id', // 设置文档Id, 可以忽略Id, Es也会自动生成
	    ]
    ];
   
    // 接着拼接index操作的内容,这里就是我们需要插入的文档内容
    $params['body'][] = [
        'my_field'     => 'my_value',
        'second_field' => 'some more values'
    ];
}

// 执行bulk操作
$responses = $client->bulk($params);

查询文档

根据文档id查询

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id' // 需要查询的文档id
];

// 执行请求
$response = $client->get($params);

局部更新文档

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id', // 文档id
    'body'  => [ // ES请求体内容
        'doc' => [ // doc包含的内容就是我们想更新的字段内容
            'new_field' => 'abc'
        ]
    ]
];

// 执行ES请求
$response = $client->update($params);

update by query

根据查询条件匹配更新内容

$params = [
    'index' => 'my_index', // 索引名
    // 如果出现版本冲突,如何处理?proceed表示继续更新,abort表示停止更新
    'conflicts' => 'proceed', 
    'body' => [ // ES请求体内容
        // 通过script更新文档内容,ctx._source代表匹配到的文档
        // 含义等于 counter字段值 + 1
        'script' => 'ctx._source.counter++',
        'query' => [ // 设置查询条件,跟es查询语法一致
            "term" => [
                'user_id' => 'kimchy'
            ]
        ],
    ],
];
$response = $client->updateByQuery($params);

提示:ES查询语法,请参考:Elasticsearch查询语法,只要将ES查询语法转换成PHP数组即可

Upserts

更新文档内容,如果文档不存在则插入文档。

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id', // 文档id
    'body'  => [ // es请求体
        'script' => [ // 通过脚本更新内容
            // 设置脚本内容,ctx._source代表匹配的文档内容,脚本含义: counter字段值 + 脚本参数count
            'source' => 'ctx._source.counter += params.count',
            'params' => [ // 设置脚本参数
                'count' => 4
            ],
        ],
        // 如果文档不存在,则插入upsert设置的内容
        // upsert的内容就相当于默认值
        'upsert' => [
            'counter' => 1
        ],
    ]
];

// 执行请求
$response = $client->update($params);

删除文档

根据文档Id删除文档

$params = [
    'index' => 'my_index', // 索引名
    'id'    => 'my_id' // 文档id
];

// 执行请求
$response = $client->delete($params);

delete by query

根据查询条件,批量删除文档

$params = [
    'index' => 'my_index', // 索引名
    // 如果出现版本冲突,如何处理?proceed表示继续更新,abort表示停止更新
    'conflicts' => 'proceed',
    'body' => [ // ES请求体内容
        'query' => [ // 设置查询条件,跟es查询语法一致
            "term" => [
                'user_id' => 'kimchy'
            ]
        ],
    ],
];
$client->deleteByQuery($params);