Elasticsearch 구문 검색(_search API)
_search API 란?
지금까지는 도큐먼트 단위의 입력, 수정, 삭제, 조회 하는 방법을 알아보았습니다. 하지만 Elasticsearch의 진가는 쿼리를 통한 검색 기능에 있습니다. 검색은 인덱스 단위로 이루어집니다. GET <인덱스명>/_search 형식으로 사용하며 쿼리를 입력하지 않으면 전체 도큐먼트를 찾는 match_all 검색을 합니다.
GET <인덱스명>/_search
# 위와 같이 입력할시 자동으로 아래와 같이 퀴리합니다.
# GET <인덱스명>/_search
# {
# "query": {
# "match_all": {}
# }
# }
URI 검색
_search 뒤에 q 파라메터를 사용해서 검색어를 입력할 수 있습니다. 이렇게 요청 주소에 검색어를 넣어 검색하는 방식을 URI 검색이라고 합니다. 앞에서 만든 test 인덱스에서 "value" 라는 값을 검색하기 위해서는 다음과 같이 _search?q=value를 입력합니다.
# URI 검색으로 검색어 "value" 검색 (request)
GET test/_search?q=value
결과를 보면 hits.total.value 부분에 검색 결과 전체에 해당되는 문서의 개수가 표시되고 다시 그 안의 hits:[ ] 구문 안에 배열로 가장 정확도가 높은 문서 10개가 나타납니다. 이 정확도를 relevancy(렐러번시 라고 읽습니다) 라고 하며 뒤에서 다시 설명하도록 하겠습니다
# URI 검색으로 검색어 "value" 검색 결과
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.105360515,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "3",
"_score" : 0.105360515,
"_source" : {
"field" : "value three"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.105360515,
"_source" : {
"field" : "value two"
}
}
]
}
}
두 개의 검색어 "value" 그리고 "three" 를 AND 조건으로 검색 하려면 다음과 같이 입력합니다. URI 쿼리에서는 AND, OR, NOT 의 사용이 가능하며 반드시 모두 대문자로 입력해야합니다.
# URI 검색으로 검색어 "value"와 "three"를 포함하는 것 검색
GET test/_search?q=value AND three
value 와 three 를 모두 포함한 test/_doc/3 도큐먼트 만이 결과로 리턴되었습니다. 검색어 value 을 field 필드에서 찾고 싶으면 다음과 같이 <필드명>:<검색어> 형태로 입력합니다. 검색은 항상 필드를 지정해서 하는 것이 좋습니다.
# URI 검색으로 "fleid" 필드에서 검색어 "value" 검색
GET test/_search?q=field:value
URI 검색은 루씬의 기본 쿼리 문법을 사용하며 손쉽게 다룰 수 있습니다. 또한 웹 브라우저 주소창 등에서도 사용 가능하기 때문에 빠르게 쓰긴 쉬우나 좀 더 복잡한 검색을 위해서는 다음에 설명하는 데이터 본문(data body) 검색을 이용해야 합니다.
데이터 본문 (Data Body) 검색: Request body
데이터 본문(data body) 검색은 검색 쿼리를 데이터 본문으로 입력하는 방식입니다. Elasticsearch의 QueryDSL을 사용하며 쿼리 또한 Json 형식으로 되어 있습니다. 가장 쉽고 많이 사용되는 것은 match 쿼리이며, 데이터 본문 검색으로 field 필드값이 value 인 도큐먼트를 검색하기 위해서는 <필드명>:<검색어> 방식으로 다음 명령을 실행합니다. 쿼리 입력은 항상 query 지정자로 시작하며, 응답(reponse)은 URI 검색과 유사합니다.
# 데이터 본문 검색으로 "field" 필드에서 검색어 "key"나 "value"가 포함된 내용 검색
GET test/_search
{
"query": {
"match": {
"field": "key value"
}
}
}
정확히 일치하는 구문 검색
# 데이터 본문 검색으로 "field" 필드에서 검색어 "key value"가 포함된 내용 검색
GET test/_search
{
"query": {
"match_phrase": {
"field": "key value"
}
}
}
멀티테넌시 (Multitenancy)
Elasticsearch는 여러 개의 인덱스를 한꺼번에 묶어서 검색할 수 있는 멀티테넌시를 지원합니다. logs-2018-01, logs-2018-02 … 와 같이 날짜별로 저장된 인덱스들이 있다면 이 인덱스들을 모두 logs-*/_search 명령으로 한꺼번에 검색이 가능합니다. 특히 시간순으로 따라 쌓이는 로그 데이터를 다룰 때는 인덱스를 일단위 등으로 구분하는 것이 좋습니다. 나중에 필드 구조가 변경되거나 크기가 커져서 샤드 설정을 변경하거나 할 때 더욱 용이합니다.
GET logs-2018-01,2018-02,2018-03/_search
여러 인덱스를 검색할때는 쉼표, 로 나열하거나 와일드카드 * 문자로 묶을 수 있습니다.
GET logs-2018-*/_search
참고
- 순천향대학교 교육자료: http://cs.sch.ac.kr/lecture/BigData/2017/03-ElasticSearch-Introduction.pdf
- [Elastic 가이드북] 4.3 검색 API - _search API: https://esbook.kimjmin.net/04-data/4.4-_search
'Study: DeveloperTools(DevTool) > DevTool: NoSQL(Elastic, Mongo)' 카테고리의 다른 글
[Elastic] Elasticsearch 구문 검색: 원하는 데이터를 삭제하자 (0) | 2022.08.03 |
---|---|
[Elastic] Elasticsearch 구문 검색(_search API): 대용량 데이터를 검색하자 (feat. scroll) (0) | 2022.08.02 |
[Elastic] Elasticsearch 구문 검색: 'SQL Query' to 'Query DSL' (0) | 2022.08.02 |
[Elastic] Elasticsearch 구문 검색(_bulk API): 여러 명령을 배치로 수행하자 (0) | 2022.07.27 |
[Elastic] Elasticsearch CRUD 정리: 데이터 다루기 (0) | 2022.07.27 |