[Elasticsearch] 실전 쿼리 사용법
이번 포스팅은 엘라스틱을 사용하면서 필요한
쿼리 문법 사용에 관한 포스팅입니다.
1. 인덱스는 유지, 안의 document를 모두 삭제하는 쿼리
POST [인덱스이름]/_delete_by_query
{
"query": {
"match_all": {}
}
}
- 위와 같이 하면, 생성한 인덱스와 매핑은 유지되면서, 안에 적재한 데이터가 삭제된다
- 삭제는 주의, 또 주의해야함
>> 아래는 command 버전 명령어
curl -X POST "localhost:9200/[인덱스이름]/_delete_by_query?conflicts=proceed&pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}'
2. 인덱스 삭제
DELETE [인덱스이름]
- 인덱스와 매핑정보, 안에 document까지 모든게 삭제 됨
>> 아래는 command 버전 명령어
curl -X DELETE "localhost:9200/인덱스이름?pretty"
3. 벌크로 데이터를 넣을 때
POST _bulk
{"create" : {"_index" : "2nd_contents","_type" : "_doc", "_id" : "100"}}
{"id" : "316", "set_id" : "DEMO", "a_id" : 1948, "cd_id" : 90,"c_key" : "53b64f39745","memo_s" : null,"g_key1" : "1948-90","h_key2" : "0-t0703","place" : null,"p_day" : "1970-01-01 00:00:00"}
{"create" : {"_index" : "2nd_contents_v2","_type" : "_doc", "_id" : "101"}}
{"id" : "317", "set_id" : "DEMO", "a_id" : 1948, "cd_id" : 90,"c_key" : "f39745","memo_s" : null,"g_key1" : "1948-90","h_key2" : "0-t0703","place" : null,"p_day" : "1970-01-01 00:00:00"}
- bulk로 데이터 삽입 시 꼭 주의 할 점은 인덱스 관련 명령어 한줄, 데이터 입력 관련 한줄 이렇게 입력해야함
- '\n'으로 구분이 되기 때문에 한 줄 단위를 꼭 지켜서 해줘야함. 보기편하기 위해 엔터를 입력하면 벌크 입력시 에러가 남
[ Bulk API]
- "create" : 인덱스를 생성하고 document 업데이트
- "index" : 해당 인덱스에 document 추가, 인덱스가 없으면 자동으로 생성하고 document가 추가된다.
- "update" : update를 하려면 body에 "doc"필드를 명시해야함
- "delete" : delete를 할 때는 body는 작성하지 않아도 됨
4. 매핑.json과 함께 인덱스 생성 시(command 버전)
curl -X PUT "localhost:9200/my-index?pretty" -H 'Content-Type: application/json' -d' @mapping.json
- 로컬에 mapping.json파일이 존재해야함.
- 미리 사용자가 지정한 대로 mapping하고 싶을 때 사용
- mapping을 정해 놓지 않으면 default로 데이터가 들어감
5. SQL문법만 알고 엘라스틱 문법이 어려울 경우 : 쉽게 변환할 수 있음
GET /_sql/translate
{
"query": "SELECT max(score) FROM gcp_failure GROUP BY c_key"
}
- 위와 같이 /_sql/translate을 사용하면, "query"에 입력한 sql 문법을 elk 문법으로 변환시킨 쿼리가 결과로 나옴
GET [인덱스이름]/_search
{
위에서 나온 결과를 그대로 사용
}
- 그 결과를 사용하여 엘라스틱 문법으로 검색을 하면, 쉽게 쿼리를 사용할 수 있음.
6. 특정 인덱스의 모든 결과 검색
GET [인덱스이름]/_search
{
"query" : {
"match_all" : {}
}
}
- "query" : "match_all"을 사용하면 모든 데이터를 가져오라는 뜻. 결국 모든 document가 출력 됨.
- 위에 결과를 sorting 하고 싶을 때는 아래와 같이 사용
GET [인덱스이름]/_search
{
"query" : {
"match_all" : {}
},
"sort": [
{
"[필드명]": {
"order" : "desc" #오름차순: asc, 내림차순: desc
}
}
]
}
- "sort"를 사용하면 원하는 특정 필드에 해당하는 값으로 정렬을 할 수 있음.
7. 특정 값 이상 조건 검색
GET [인덱스이름]/_search
{
"query": {
"range": {
"필드명": {
"gre": 시작 값
"gte" : 끝 값
}
}
}
}
- 특정 원하는 필드에 대해 범위를 주고 조건 검색을 할 경우 사용
- 특정 값 이상으로만 검색 할 경우 "gte"는 지우고 "gre" 값만 입력 하면 됨
8. 특정 조건문에 해당하는 document만 삭제
POST [인덱스이름]/_delete_by_query?conflicts=proceed&pretty
{
"query": {
"range": {
"필드명": {
"gre": 시작 값
}
}
}
}
- 위와 같이 하면 특정 필드의 값이 어떤 시작 값 이상인 문서에 해당하면 다 삭제가 된다.
- ?conflicts=proceed 를 입력하는 이유는 중간에 충돌이 나거나 타임아웃 발생시 그냥 진행 되도록 한다.
9. 기존 인덱스에 새로운 필드 추가
POST [인덱스이름]/_mapping
{
"새로 매핑할 정보 입력"
}
- 새로운 field에 대한 매핑 정보를 post로 입력하면된다.
- mapping에 들어갈 정보를 입력하면, 원하는 형태의 매핑으로 들어가짐
- 아래는 예시 화면
- 새롭게 추가한 field가 잘 적용되었는지 확인하기 위해 아래와 같이 입력하여 매핑정보 확인하기
GET [인덱스이름]/_mapping
10. 모든 다큐먼트의 데이터 수정(특정 필드)
- 이미 데이터를 넣어 놓은 상태에서, 모든 다큐먼트의 특정 필드의 값이 전부다 변경이 필요할 때
- 아래와 같이 활용하면 적용이 된다. 다큐먼트가 많을수록 시간이 많이 소요됨
- time out 에러를 방지하기 위해 뒤에 파라미터로 wait_for_comletion=false 붙여준다
PUT _ingest/pipline/set_change
{
"description" : "set_changing",
"processors" : [{
"set": {
"filed" : "[변경을 원하는 필드명]",
"value" : "[변경 할 데이터 값]"
}
}]
}
POST [위 변경을 적용할 인덱스이름]/_update_by_query?pipeline=set_change&wait_for_completion=false
11. 키바나에서 문법 사용 시 주의
- 키바나는 Kibana Query Language / Lucene Query Syntax 이렇게 2개의 문법이 존재 함
- 두개 문법의 사용 법이 다르기 때문에 해당하는 문법으로 검색해야 결과가 나옴
https://www.elastic.co/guide/en/kibana/7.5/kuery-query.html
- 키바나에서 on/off로 원하는 문법을 설정할 수 있다.
- 설정 on : Kibana Query Language, off : Lucene Query Syntax