ElasticSearch之PHP-SDK基础篇

作者: Dsir 分类: Server 发布时间: 2018年03月02日 16时20分

我们先理解ES的索引、类型、文档、字段之间的关系:

    Relational DB -> Databases -> Tables -> Rows -> Columns

    Elasticsearch -> Indices -> Types -> Documents -> Fields

基础篇:

1、实例化ES

require_once('./../elasticsearch/autoload.php');

$client = \Elasticsearch\ClientBuilder::create()->setHosts(['http://localhost:9200'])->build();

2、创建索引并设置

注意:在调用时提示No alive nodes found in your cluster那么很可能是无法访问你的ES服务器所导致,参考文章:ElasticSearch之centos安装的最后一步修改network.host示例

$params = [
    'index' => '索引名称'
    'number_of_shards' => 1,  //分片
    'number_of_replicas' => 0, //备份
    //等等设置项......
];

// Create the index
$response = $client->indices()->create($params);

3、设置类型、Fields

$params = [
    'index' => '索引',
    'type' => '类型',
    'body' => [
        '类型' => [
            'properties' => [
                'first_name' => [
                    'type' => 'string',
                    'analyzer' => 'standard' //分词
                ],
                'age' => [
                    'type' => 'integer'
                ]
            ]
        ]
    ]
];

$client->indices()->putMapping($params);

4、单字段搜索:

$params = [
    'index' => '索引',
    'type' => '类型',
    'body' => [
        'query' => [
            'match' => [
                '字段' => '值'
            ]
        ]
    ]
];

$results = $client->search($params);

5、多字段搜索:

$params = [
    'index' => '索引',
    'type' => '类型',
    'body' => [
        'query' => [
            'bool' => [
                'must' => [
                    [ 'match' => [ '字段' => '值' ] ],
                    [ 'match' => [ '字段' => '值' ] ],
                ]
            ]
        ]
    ]
];

$results = $client->search($params);

6、插入文档

$params = [
    'index' => '索引',
    'type' => '类型',
    'id' => 'ID',(如果ID不存在则ES会自动生成索引ID)
    'body' => [ '字段'=>'值'......]
];

$response = $client->index($params);

7、批量导入数据

$data = DB::table(xxxx)->field(xxx)->select();  //获取数据源

//配置ES服务器索引
$param = [
    'index' => 'dmg', //索引
    'type' => 'paper',//类型
];
//循环插入
$data_count = count($data);
for($i = 1;$i < $data_count;$i++){

    //配置Field内容
    $param['body'][] = ['index'=>['_id' => $data['id']]];
    $param['body'][] = [
        'classify' => $data['classify'],
        'pmid' => $data ['pmid'],
        'entity' => $data['entity'],
    ];
    
    //每五百条添加一次ES服务器
    if(count($param['body']) >= 500){
        $result = $client->bulk($param);
        if($result){
            $output->writeln('YES');
            //清除已经被添加的数据
            $param['body'] = [];
        }
    }
    $output->writeln($i);
}

温馨提示

如果我们要手动给es document设置一个id,那么es需要每次都去确认一下那个id是否存在,这个过程是比较耗费时间的。如果我们使用自动生成的id,那么es就可以跳过这个步骤,写入性能会更好。对于你的业务中的表id,可以作为es document的一个field。

ES索引写入性能优化:ElasticSearch之索引写入性能优化
官方php-SDK文档:Elasticsearch-PHP

如果觉得我的文章对您有用,请随意打赏、分享。您的支持将鼓励我继续创作!

微博分享
2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注