ES는 검색 엔진인 만큼 다양한 검색 API를 제공하며, 이를 잘 알아야 ES를 효과적으로 사용할 수 있을 것이라 생각합니다.
이번 글에서는 Search API에 대해 알아보겠습니다.
다음 글 Query DSL을 다루기 위한 사전지식/준비작업 느낌입니다.
1. 검색하기 전 테스트 테이터 셋팅
검색을 하려면 대량의 데이터가 필요합니다.
ES 공식 문서에 이를 제공해주는데요( 링크 ), 이를 복붙해서 json 파일을 만들고 아래의 명령어를 실행해서 bulk API를 호출합니다.
bulk API는 여기에서 다룰 것이며, 지금은 대량으로 document를 추가하기 위한 API라고 생각하시면 됩니다.
# vi test_data.json 위 링크에서 데이터를 복붙하여 저장
// bulk API 호출
# curl -XPOST 'localhost:9200/bank/account/_bulk?pretty&refresh' -H "Content-Type: application/json" --data-binary "@test_data.json"
// bank index가 추가되었는지 확인
# curl -XGET 'localhost:9200/_cat/indices?v'
위와 같이 1000개의 데이터가 추가되었으면 성공입니다.
2. search API
search API는 이전 글에서 모든 document를 검색할 때 사용했었습니다.
# curl -XGET 'localhost:9200/_all/_search?pretty'
_serach는 검색 작업을 하겠다는 액션을 의미합니다. ( serach API )
그리고 어떻게 검색을 할 것인지에 대한 조건( 쿼리 )들을 명시를 해줘야 원하는 정보들을 얻을 수 있을겁니다.
조건 전달 방법은 2가지가 있습니다.
- URL에 파라미터를 넘기는 방법 ( URI Search )
- json 파일에 쿼리를 작성하여 POST 방식으로 넘기는 방법 ( Query DSL )
이 중에서 후자의 방법을 더 많이 사용합니다.
그 이유는 URL이 깔끔해지고, 더 상세한 표현이 가능할 뿐더러 재사용이 가능하기 때문이죠.
URL을 호출하는 방법은 짧게만 언급하고 다음 글에서 Query DSL에 대해 자세히 알아보도록 하겠습니다.
3. URI Search
URI Search 방식은 모든 검색 옵션을 노출하지 않지만, 빠른 curl 테스트에 유용한 방법입니다.
아래의 API 호출은 위의 테스트 데이터에서 age가 39살인 document만 조회하는 예제입니다.
# curl -XGET 'localhost:9200/bank/account/_search?q=age:39&pretty'
파라미터로 q=age:39를 전달 했더니, 1000개의 document 중 60개만 조회되는 것을 확인할 수 있습니다.
참고로 파라미터 q는 쿼리 스트링으로 Query String Query( 참고 )로 변환됩니다.
그 밖에,
- 정렬 옵션 sort
- offset과 유사한 from - 기본 값 0
- 몇 개를 반환할 것인지에 대한 size - 기본 값 10개
등 다양한 파라미터를 전달 할 수 있는데요, 더 많은 파라미터 정보는 링크를 참고해주세요.
이처럼 검색 결과를 가공하는 부분은 다음 글에서 다루도록 하겠습니다.
4. Response 분석
Search API를 요청하니 응답을 json으로 주고 있습니다.
response의 각 의미는 다음과 같습니다.
- took : 검색하는데 걸린 시간 (단위: ms)
- timed_out : 검색시 시간 초과 여부
- _shards : 검색한 shard 수 및 검색에 성공 또는 실패한 shard의 수
- hits : 검색 결과
- total : 검색 조건과 일치하는 문서의 총 개수
- max_score : 검색 조건과 결과 일치 수준의 최댓값
- hits : 검색 결과에 해당하는 실제 데이터들 ( 기본 값으로 10개가 설정되며, size를 통해 조절 가능 )
- _score : 해당 document가 지정된 검색 쿼리와 얼마나 일치하는지를 상대적으로 나타내는 숫자 값이며, 높을수록 관련성이 높음
- sort : 결과 정렬 방식을 말하며, 기본 정렬 순서는 _score 내림차순(desc)이고, 다른 항목일 경우 오름차순(asc)으로 기본 설정 됨 ( _score 기준일 경우 노출되지 않음 )
이상으로 Search API에 대해 알아보았습니다.
다음 글에서는 Query DSL에 대해 알아보겠습니다.