>백엔드 개발 >PHP 튜토리얼 >Elasticsearch-PHP API 소개

Elasticsearch-PHP API 소개

不言
不言원래의
2018-04-13 09:13:172489검색

이 글은 Elasticsearch-PHP API에 대한 소개를 소개합니다. 이제 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

Elasticsearch는 현재 널리 사용되는 빅데이터 처리 프레임워크 중 하나입니다. Baidu 등
다음 기사에서는 es 약어를 사용하여 Elasticsearch를 나타냅니다.

es에는 공식 PHP API 인터페이스가 있으며, 이는 Github 또는 Composer에서 다운로드할 수 있습니다.


1. 인덱스 생성 ($client->indices()->create())

      $params = [                'index' => 'user_index',  //索引名(相当于mysql的数据库)
                'body' => [                    'mappings' => [                        'normal_type' => [ //类型名(相当于mysql的表)
                            '_all'=>[   //  是否开启所有字段的检索
                                'enabled' => 'false'
                            ],                            'properties' => [ //文档类型设置(相当于mysql的数据类型)
                                'uid' => [                                    'type' => 'integer' // 字段类型为整型
                                ],                                'username' => [                                    'type' => 'keyword' // 字段类型为关键字,如果需要全文检索,则修改为text,注意keyword字段为整体查询,不能作为模糊搜索
                                ],                                'platform' => [                                    'type' => 'keyword'
                                ],                                'mobile' => [                                    'type' => 'integer'
                                ],                                'sex' => [                                    'type' => 'integer'
                                ],                                'source' => [                                    'type' => 'keyword'
                                ],                                'province' => [                                    'type' => 'keyword'
                                ],                                'city' => [                                    'type' => 'keyword'
                                ],                              'tag' =>   [                                'properties'    =>  [                                    'tagName'   =>[                                        'type' => 'text'
                                    ],                                    'tagWeight'   => [                                        'type' => 'integer',
                                    ]
                                ]
                            ],
                            ]
                        ]
                    ]
                ]
            ];
            $data = $client->indices()->create($params);

간단한 인덱스가 생성되었으니 이제 새로 생성된 인덱스 정보를 얻을 수 있습니다.

2. 인덱스 정보

2.1 인덱스 정보 가져오기($client->indices()->getSettings())

     $params = [                'index' => 'user_index',                'client' => [                    'ignore' => 404
                ]
            ];
    $res = $client->indices()->getSettings($params);//获取库索引设置信息

반환된 결과는 다음과 같습니다.

  array (    'user_index' => 
    array (    'settings' => 
    array (      'index' => 
      array (        'creation_date' => '1498116455327',        'number_of_shards' => '5',        'number_of_replicas' => '1',        'uuid' => '8pkONoI7RAuw5HjnFa4UaQ',        'version' => 
        array (          'created' => '5020299',
        ),        'provided_name' => 'user_index',
        ),
      ),
    ),
 )

2.2 매핑 정보 가져오기

  • 인터페이스: $client- >indices()-> ;getMapping

$params = [                'index' => 'user_index',                'client' => [                    'ignore' => 404
                ]
            ];
$res = $client->indices()->getMapping($params);   //获取mapping信息

반환된 결과는 다음과 같습니다.

array (  'user_index' => 
  array (    'mappings' => 
    array (      'normal_type' => 
      array (        '_all' => 
        array (          'enabled' => false,
        ),        'properties' => 
        array (          'city' => 
          array (            'type' => 'keyword',
          ),          'mobile' => 
          array (            'type' => 'integer',
          ),          'platform' => 
          array (            'type' => 'keyword',
          ),          'province' => 
          array (            'type' => 'keyword',
          ),          'sex' => 
          array (            'type' => 'integer',
          ),          'source' => 
          array (            'type' => 'keyword',
          ),          'uid' => 
          array (            'type' => 'integer',
          ),          'username' => 
          array (            'type' => 'keyword',
          ),
        ),
      ),
    ),
  ),
)

여기에서 얻은 관련 정보는 방금 생성한 인덱스 es를 동적으로 수정하고 관련 정보를 추가할 수 있다는 것입니다.

2.3 수정 /매핑 정보 추가

  • 참고: 설정된 필드 유형은 변경할 수 없습니다!!

  • 인터페이스: $client->indices()->putMapping();

        $params = [            'index' => 'user_index',  //索引名(相当于mysql的数据库)
            'type'  => 'normal_type',            'body'  =>  [                'normal_type' => [                    'properties'    =>[                        'tag'   =>[                            'type'  => 'text'
                        ]
                    ]
                ]
            ]
        ];
$client->indices()->putMapping($params);

2.4 인덱스 삭제

  • 인터페이스:$ client->indices()->delete($params);

        $params = [            'index' => 'user_index',  //索引名(相当于mysql的数据库)
        ];

3 es 추가, 삭제, 수정 및 확인

3.1 데이터 추가

  • 단일 데이터 삽입

  • 인터페이스: $client-> index()

$params = [    'index' => 'my_index',    'type' => 'my_type',    'id' => 'my_id', // 不填则es会自动生成唯一的id
    'body' => [ 'testField' => 'abc']
];
$response = $client->index($params);
  • 일괄 데이터 삽입

  • 인터페이스: $client->bulk();

                foreach($userList as $value){
                    $params['body'][] = [                        'index' => [                            '_index' => 'user_index',                            '_type' => 'normal_type',                            '_id'  =>$value['uid']
                        ]
                    ];
                    $params['body'][] = [                        'uid' => $value['uid'],                        'username' => $value['username'],                        'platform' => $value['platform'],                        'mobile' => $value['mobile'],                        'province' => $value['province'],                        'city' => $value['city'],                        'sex' => $value['gender '],                        'source'=>'xxx'
                    ];
                }
                $responses = $client->bulk($params);
  • ps: 루프에 데이터 양이 많으면 PHP의 메모리 제한 문제에 주의해야 합니다. (이 프레임워크의 어느 부분이 작업 후 메모리를 해제하지 않는지는 확실하지 않습니다.)

3.2 데이터 검색

  • 단일 데이터 검색이지만 ID를 알아야 합니다

  • 인터페이스: $client->get ()

$params = [    'index' => 'my_index',    'type' => 'my_type',    'id' => 'my_id' // es 自动生成/自己录入的];
$response = $client->get($params);
  • 일괄 검색

  • 인터페이스: $client->search()

$params = [  
    'index' =>  'my_index',   //['my_index1', 'my_index2'],可以通过这种形式进行跨库查询  
    'type' => 'my_type',//['my_type1', 'my_type2'],  
    'body' => [  
        'query' => [  
            'match' => [  // 搜索条件
                'age' => '24' ,                'tag.tagName' =>'tag'  // 如果字段存储的是object.
                                       //这里搜索必须要这样才能搜索出结果.
            ]  
        ],  
        'from' => '0',  // 分页
        'size' => '200'  // 每页数量
        'sort' => [  // 排序
            'age' => 'desc'   //对age字段进行降序排序  
        ]  
    ]  
];  
$res = $client->search($params);

반환된 데이터는 대략 다음과 같습니다.

array (size=4)  'took' => int 2
  'timed_out' => boolean false
  '_shards' => 
    array (size=3)      'total' => int 5
      'successful' => int 5
      'failed' => int 0
  'hits' =>  // 搜索到数据
    array (size=3)      'total' => int 2
      'max_score' => float 1
      'hits' => // 具体数据包
        array (size=1)          0 => 
            array (size=5)
              ...
  • 필요한 경우가 많아 mysql/or Query es 검색도 가능합니다.

  • 이번에는 es 조합 필터를 사용하겠습니다

  • https://www.elastic.co/guide/cn/elasticsearch/guide/current/ Combine-filters.html 공식 문서는 다음과 같습니다

  • 다음은 테스트한 예입니다

{    "index": "xxx_index", 
    "type": "normal_type", 
    "body": {        "size": 20, 
        "from": 0, 
        "query": {            "bool": {                "must": [
                    {                        "match": {                            "tag.tagName": "xxxx"
                        }
                    }
                ]
            }
        }, 
        "sort": {            "uid": "desc"
        }
    }
}

3.3 데이터 삭제

  • 참고: 데이터가 삭제되는 특정 캐시 업데이트 시간이 있으며, 업데이트되지 않은 경우에도 계속 업데이트됩니다.

  • 인터페이스: $client->delete( );

$param = [                'index' => 'my_index',                'type' => 'my_type',                'id'    => 'my_id'
            ];
            $ret = $this->client->delete($param);

반환된 데이터는 다음과 같습니다:

array (size=7)  'found' => boolean true
  '_index' => string 'user_index' (length=10)  '_type' => string 'normal_type' (length=11)  '_id' => string 'AVzh_QnIZvcaH3gE7MvE' (length=20)  '_version' => int 2
  'result' => string 'deleted' (length=7)  '_shards' => 
    array (size=3)      'total' => int 2
      'successful' => int 1
      'failed' => int 0

3.4 업데이트 데이터

  • 인터페이스: $client->update()

$params = [  
    'index' => 'my_index',  
    'type' => 'my_type',  
    'id' => '3416a75f4cea9109507cacd8e2f2aefc',  
    'body' => [  
        'doc' => [  // 必须带上这个.表示是文档操作
            'age' => 150  
        ]  
    ]  
];  
$res = $client->update($params);

반환 결과

array (size=6)  '_index' => string 'user_index' (length=10)  '_type' => string 'normal_type' (length=11)  '_id' => string 'AVzh_QnIZvcaH3gE7Mw5' (length=20)  '_version' => int 2
  'result' => string 'updated' (length=7)  '_shards' => 
    array (size=3)      'total' => int 2
      'successful' => int 1 // 当数据没有发生变化时这里是为0
      'failed' => int 0

4. indexes

  • 참고: 서로 다른 인덱스 간에 데이터를 반전하는 경우 필드 유형에 주의해야 합니다. 유형이 다르면 가져오기가 실패할 수 있습니다. 이때 처리용 스크립트를 사용할 수 있습니다

  • 이 인터페이스입니다. phpapi에서는 실행할 수 없으며 레코드로 존재합니다

  • 인터페이스: POST _reindex

POST _reindex
{  "source": {    "index": "user_profile"
  },  "dest": {    "index": "user_prfile_v1"
  },  "script": {    "inline": " ctx._source.tag=params.new_tags",    "params": {      "new_tags":{        "tagName":null,        "tagWeight":0
      }
    }
  }
}



저자: Tang Minzheng
링크:https://www.jianshu.com /p/a2837f487de6

관련 권장사항:

php

에서 인터페이스 API를 호출하는 방법

Vue 프로젝트 API 관련 코드 구성에 대하여


위 내용은 Elasticsearch-PHP API 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.