ES|QL에서 PHP 객체로
PHP에서 ES|QL 쿼리를 실행하고 관리하는 방법을 알아보세요. 이 가이드에 따라 ES|QL 결과를 PHP 객체 또는 사용자 정의 클래스에 매핑하세요.
Elasticsearch를 직접 체험해 보세요. Elasticsearch Labs 리포지토리의 샘플 노트북을 살펴보거나, 무료 클라우드 체험을 시작해 보세요. 지금 바로 로컬 컴퓨터에서 Elastic을 사용해 보셔도 좋습니다.
elasticsearch-php v8.13.0부터는 ES|QL 쿼리를 실행하고 그 결과를 stdClass 또는 사용자 정의 클래스의 PHP 객체에 매핑할 수 있습니다.
ES|QL
ES|QL은 Elasticsearch 8.11.0에 도입된 새로운 Elasticsearch 쿼리 언어입니다. 현재는 기술 미리보기 버전으로 제공됩니다. Elasticsearch에 저장된 데이터를 필터링, 변환, 분석할 수 있는 강력한 방법을 제공합니다.
"파이프" (|)를 사용하여 단계별 방식으로 데이터를 조작하고 변환합니다. 이 접근 방식을 통해 사용자는 한 작업의 출력이 다음 작업의 입력이 되는 일련의 작업을 구성하여 복잡한 데이터 변환 및 분석을 수행할 수 있습니다.
예를 들어 다음 쿼리는 sample_data 인덱스의 처음 3개 문서(행)를 반환합니다:
FROM sample_data
| LIMIT 3사용 사례: 공식 PHP 클라이언트의 ES|QL 기능
공식 PHP 클라이언트에서 개발된 ES|QL 기능을 설명하기 위해 다음 정보를 포함한 81,828권의 책(54.4MB)으로 구성된 CSV 파일을 Elasticsearch에 저장했습니다:
Title;Descrition;Author;Year;Publisher;Ratings이 목록은 공개적으로 사용 가능한 Amazon 서평 데이터 세트에서 추출했습니다.
다음 Elasticsearch 매핑을 사용하여 books 인덱스를 생성했습니다:
'mappings' : {
'properties': {
'title': {
'type': 'text'
},
'description': {
'type': 'text'
},
'author': {
'type': 'text'
},
'year': {
'type': 'short'
},
'publisher': {
'type': 'keyword'
},
'rating': {
'type': 'half_float'
}
}
}rating 값은 2.9GB의 Books_rating.csv 파일에서 가져온 순위 리뷰의 평균입니다.
여기에서 Elasticsearch에서 모든 도서를 일괄 가져오기 위해 사용한 PHP 스크립트를 찾을 수 있습니다. 대량 작업은 PHP 8.2.17을 사용하여 7초와 28MB RAM이 소요되었습니다. 제안된 매핑을 사용하면 Elasticsearch의 인덱스 크기는 약 62MB입니다.
ES|QL 결과를 PHP 객체 또는 사용자 정의 클래스에 매핑하기
esql()->query() 엔드포인트를 사용하여 PHP에서 ES|QL 쿼리를 실행할 수 있습니다. 이 쿼리의 결과는 테이블 데이터 구조입니다. 이는 columns 및 values 필드를 사용하여 JSON으로 표현됩니다. columns 필드에는 name 및 type 정의가 있습니다.
다음은 사용자 순위 리뷰에 따라 스티븐 킹이 쓴 상위 10권의 책을 검색하는 ES|QL 쿼리의 예입니다:
$query = <<<EOD
FROM books
| WHERE author == "Stephen King"
| SORT rating DESC
| LIMIT 10
EOD;
$result = $client->esql()->query([
'body' => ['query' => $query]
]);Elasticsearch의 JSON 결과는 다음과 같습니다:
{
"columns": [
{ "name": "author", "type": "text" },
{ "name": "description", "type": "text" },
{ "name": "publisher", "type": "keyword" },
{ "name": "rating", "type": "double" },
{ "name": "title", "type": "text" },
{ "name": "year", "type": "integer" }
],
"values": [
[
"Stephen King",
"The author ...",
"Turtleback",
5.0,
"How writers write",
2002
],
[
"Stephen King",
"In Blockade Billy, a retired coach...",
"Simon and Schuster",
5.0,
"Blockade",
2010
],
[
"Stephen King",
"A chilling collection of twenty horror stories.",
"Signet Book",
4.55859375,
"Night Shift (Signet)",
1979
],
...
]
}이 예에서는 책과 관련된 6개의 속성(저자, 설명, 출판사, 등급, 제목, 연도)과 10개의 결과(모두 스티븐 킹의 책)가 있습니다.
ES|QL에서 지원되는 모든 유형 목록은 여기에 나와 있습니다.
$result 응답 개체는 배열, 문자열 또는 객체로 액세스할 수 있습니다(자세한 내용은 여기를 참조하세요).
객체 인터페이스를 사용하면 속성 및 인덱스를 사용하여 값에 액세스할 수 있습니다. 예를 들어 $result->values[0][4] 은 목록에서 첫 번째 책(0)의 제목(4)을 반환하고 $result->values[1][3] 은 두 번째 책(1)의 순위 점수(3) 등을 반환합니다. PHP에서 배열의 인덱스는 0부터 시작한다는 점을 기억하세요.
이 인터페이스는 일부 사용 사례에는 충분할 수 있지만 대부분의 경우 결과물로 여러 개의 객체를 원합니다.
결과를 객체 배열로 매핑하려면 elasticsearch-php의 새로운 mapTo() 기능을 사용할 수 있습니다.
이 기능은 Elasticsearch 응답 개체에서 직접 사용할 수 있습니다. 즉, 다음과 같이 액세스할 수 있습니다:
$books = $result->mapTo(); // Array of stdClass
foreach ($books as $book) {
printf(
"%s, %s, %d, Rating: %.2f\n",
$book->author,
$book->title,
$book->year,
$book->rating
);
}사용자 지정 Book 클래스가 있는 경우 다음과 같이 이를 사용하여 결과를 매핑할 수 있습니다:
class Book
{
public string $author;
public string $title;
public string $description;
public int $year;
public float $rating;
}
$books = $result->mapTo(Book::class); // Array of Book클래스에 ES|QL 결과에 포함된 속성 외에 다른 속성이 있는 경우 이 방법도 작동합니다. mapTo() 함수는 ES|QL 결과의 열로 반환된 속성만 사용합니다.
이 문서에 보고된 모든 예제는 여기에서 다운로드할 수 있습니다.
자주 묻는 질문
ES|QL이란 무엇인가요?
ES|QL은 Elasticsearch 8.11.0에 도입된 Elasticsearch 쿼리 언어입니다. Elasticsearch에 저장된 데이터를 필터링, 변환, 분석할 수 있는 강력한 방법을 제공합니다.
이 콘텐츠가 얼마나 도움이 되었습니까?




