들어가며

엘라스틱서치를 클러스터로 운영하게 되면 다음과 같이 몇가지 문제를 맞이 할 수 있습니다

  1. 디스크 문제
  2. 메모리 문제
  3. 샤드 할당 문제
  4. 기타 등등

클러스터의 경우 마스터노드와 데이터노드 코디네이터 노드를 여러대 운영하기 때문에 노드의 추가와 제거가 가능합니다
다만, 간단한 작업의 경우 서버 재시작보다는 rolling restart 방법을 고려해 보는게 좋습니다.


문제상황 (예시)

  • 여기선, 단순히 heap 메모리 증설의 경우를 들어 설명하겠습니다.
  • 데이터 노드의 heap 메모리 부족
  • 먼저, 물리 메모리가 확보 됐는지 확인하고, 가능하다면 heap 메모리를 늘려주자

해결방안

메모리 증설은 해당 노드만 종료후 재실행시켜주면 되기에
엘라스틱서치 전체 재시작보다는 rolling-restart 방식을 취하는 것이 좋습니다

쿼리는 kibana 기준으로 작성 되어 있습니다

  • Step1 heap 메모리 재할당
    # path /elasticsearch/data/config/jvm.options
    Xms4g
    Xmx4g

샤드는 프라이머리, 레플리카로 구성됩니다.
노드가 종료되면 샤드 재배치라는 고비용 작업이 이루어지게
rolling-restart 작업을 할 시에는 샤드 재할당 기능을 종료시켜 놓습니다

  • Step2 샤드 할당 비활성

    # kibana 쿼리 / ES 6.4.2 # 노드를 중단했을때 샤드들이 재배치 되지 않도록 설정 
    PUT _cluster/settings { 
      "persistent": {     
          "cluster.routing.allocation.enable": "none" 
      } 
    }
  • Step3 세그먼트 동기화

    # kibana 쿼리 / ES 6.4.2 # primary - replica 간의 세그먼트 저장 상태를 동기화 
    POST _flush/synced
  • Step4 ES 재실행
    재실행시 elasticsearch의 권한을 잘 확인해보는 것이 좋습니다!!

  • Step5 샤드 할당 활성

    # kibana 쿼리 / ES 6.4.2 # unassigned 된 샤드 재배치 
    PUT _cluster/settings 
    { 
      "persistent": { 
          "cluster.routing.allocation.enable": null 
      } 
    }
  • step6 헬스 체크

    GET _cat/health

참조

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

들어가며

이 글을 읽고 있다면 아마 높은 확률로 ES 클러스터의 디스크 문제로 발생하지 않았을까 합니다 ^^
색인 배치를 만들게 되면 디스크 full 문제가 발생할 수 있는데요, ES는 이러한 경우 읽기 모드로 전환되게 합니다.
읽기 모드에 들어가게 되면 당연히 인덱스의 변경이나 삭제가 불가능한 문제가 발생합니다

해결 방법

  1. 우선적으로 사용하지 않는 인덱스를 삭제하여 줍니다
  2. 인덱스의 읽기 모드를 false로 변경하여 줍니다 (kibana 쿼리)
    PUT _all/_settings 
    {
     "index": { 
         "blocks": { 
             "read_only_allow_delete": "false" 
         } 
     } 
    }

추가적으로 disk 문제의 경우 주기적으로 발생할 수 있는 문제라 생각되면 디스크 증설도 고려해보는게 좋다고 생각합니다.
그럴 경우 클러스터의 데이터 노드를 추가할 것을 권합니다

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

엘라스틱서치를 운영하게 되면 운영 인덱스, 백업용 인덱스들을 여러개 만들게 된다.

다만, 예기치 않은 오류가 발생하여 수동으로 alias를 직접 설정해야 할 경우도 생긴다.

되도록이면 예외처리 코드와 케이스 검사를 잘 해두어 직접 다루는 경우가 없도록 하자 

  • 인덱스 ALIAS 설정 예제 (curl)
curl -X POST "http://www.localhost.com:9200/_aliases" -H 'Content-Type: application/json' -d '{
    "actions": [
        {
            "add" : {
                "index" : "koo-product-202103291800",
                "alias" : "koo-product"
            }
        }
    ]
}'

결과 : {"acknowledged":true}%

 

  • kibana 인덱스 ALIAS 설정 예제
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "my-data-stream",
        "alias": "my-alias"
      }
    }
  ]
}
블로그 이미지

사용자 yhmane

댓글을 달아 주세요

서비스를 운영하다 보면 데이터 필드의 값을 더하거나 평균을 내는 등 검색 쿼리로 반환된 데이터를 집계하는 경우가 많다. 검색 쿼리의 결과 집계는 다음과 같이 기존 검색 쿼리에 집계 구문을 추가하는 방식으로 수행할 수 있다.

{
    "query": { ... 생략 ...},
    "aggs": { ... 생략 ... }
}

엘라스틱서치는 집계 시 문서를 평가한 후 기준에 만족하는 문서들을 하나로 그룹화한다.
그룹화한 집합을 토대로 집계를 수행하고, 집계가 끝나면 버킷 목록에 속한 문서의 집합이 출력 된다.


집계 종류

  • 메트릭 집계
  • 버킷집계
  • 파이프라인 집계
  • 행렬 집계

메트릭 집계

메트릭 집계는 이름에서도 알 수 있듯이 정수 또는 실수와 같이 숫자 연산을 할 수 있는 값들에 대한 집계를 수행한다. 일반적으로 필드 데이터를 사용해 집계가 이뤄지지만 스크립트를 사용해 조금 더 유연하게 집계를 수행할 수도 있다.

요청값 구조

GET /apache-web-log/_search?size=0  ---1)
{
    "aggs": { ---2)
        "<집계 이름>": { ---3)
            "<집계 타입">: { ---4)
                "field": "<필드명>" ---5)
            }
        }
    }
}
  • 1) size : 집계된 문서들의 데이터는 불필요하므로 size 값을 0 으로 지정해 반환받지 않는다.
  • 2) aggs: 집계를 수행한다. aggregation 또는 aggs를 사용
  • 3) 집계 이름 : 집계에 대한 이름이다. 하위 쿼리 또는 여러 쿼리를 함께 사용할 떄 구별하는 용도로 사용한다.
  • 4) 집계 타입 : 합계, 평규느 시계열 등의 집계 타입을 명시한다.
  • 5) field : 집계의 대상이 되는 필드를 명시한다.

응답값 구조

{
    "took": 1, 
    "timed_out": false,
    "_shards": {
        "total": 5,
        "succeccful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 200,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "<집계이름>": {
            "<집계결과>"
        }
    }
}

합산 집계

합산 집계는 단일 숫자 메트릭 집계에 해당한다. 다음과 같이 집계 쿼리를 수행한다.

GET /apache-web-log/_search?size=0
{
    "aggs": {
        "total_bytes": {
            "sum": {
                "field": "bytes"
            }
        }
    }
}

cerebro를 이용한 화면을 보자. 총 얼마만큼의 데이터 (Bytes)가 유입 됐는지 확인할 수 있다.

조금더 확장해서 사용해보자. 이번엔 filter를 추가하여 'geoip.city_name'의 필드값이 'Paris'인 것을 집계해보자

{
    "query": {
      "constant_score": {
          "filter": {
              "match": {"geoip.city_name": "Paris"}
          }
      }  
    },
    "aggs": {
        "total_bytes": {
            "sum": {
                "field": "bytes"
            }
        }
    }
}

cerebro를 이용해 결과 화면을 봐보자. 필터가 적용된 bytes를 확인할 수 있다.


평균 집계

평균 집계는 단일 숫자 메트릭 집계에 해당한다. 마찬가지로 간단한 예제를 수행해보자

{
    "aggs": {
        "avg_bytes": {
            "avg": {
                "field": "bytes"
            }
        }
    }
}

세레브로로 결과를 확인해보자. 평균값을 확인할 수 있다.

합산 집계와 마찬가지로 평균집계에도 필터를 적용하여 보자.

{
    "query": {
      "constant_score": {
          "filter": {
              "match": {"geoip.city_name": "Paris"}
          }
      }  
    },
    "aggs": {
        "avg_bytes": {
            "avg": {
                "field": "bytes"
            }
        }
    }
}


* 최솟값, 최댓값 집계*

최솟값 집계와 최댓값 집계는 모두 단일 숫자 메트릭 집계에 해당한다.

{
    "query": {
      "constant_score": {
          "filter": {
              "match": {"geoip.city_name": "Paris"}
          }
      }  
    },
    "aggs": {
        "min_bytes": {
            "min": {
                "field": "bytes"
            }
        }
    }
}

cerebro를 확인해보자. 집계이름과, 집계 타입, 결과만 확인해보자. (min, max)



개수 집계

개수집계는 단일 숫자 메트릭 집계에 해당한다.

{
    "query": {
      "constant_score": {
          "filter": {
              "match": {"geoip.city_name": "Paris"}
          }
      }  
    },
    "aggs": {
        "bytes_count": {
            "value_count": {
                "field": "bytes"
            }
        }
    }
}

위 쿼리는 파리 지역에서 일어난 사용자 요청 횟수를 집계 하였다. cerebro를 이용해 확인해보자.


통계 집계

통계 집계는 다중 숫자 메트릭 집계에 해당한다. 통계 집계를 이용하면 앞서 살펴본 합, 평균, 최대, 최소, 개수를 한번의 쿼리로 집계할 수 있다.

{
    "query": {
      "constant_score": {
          "filter": {
              "match": {"geoip.city_name": "Paris"}
          }
      }  
    },
    "aggs": {
        "bytes_stats": {
            "stats": {
                "field": "bytes"
            }
        }
    }
}

결과는 다음과 같다.

통계 이외에도, 확장 통계를 이용하여 더 다양한 집계를 할 수 있다. 표준편차와 같은 통계값이 추가 된다. 집계 타입은 (stats-> extend_stats)으로 바꿔주면 된다.


이번 포스팅에서는 집계에 대하여 간략히 알아보았습니다.
메트릭 집계는 정수 또는 실수와 같은 숫자 연산을 할 수 있는 값들에 대한 집계를 수행하는데, 조금 더 응용하면 유용하게 쓰일 수 있습니다.
다음 포스팅에서는 버킷집계, 파이프라인 집계 등에 대하여 알아보도록 하겠습니다.


참조

  • 엘라스틱서치 실무가이드 chap5
블로그 이미지

사용자 yhmane

댓글을 달아 주세요

환경설정 참고
환경설정은 검색 API를 다루었을 때 하였습니다. 집계용 스냅샷만 추가해주면 됩니다.

스냅샷 설정

  • 집계 스냅샷 생성
    curl -XPUT 'http://localhost:9200/_snapshot/apache-web-log' -H 'Content-Type:application/json' -d' {
      "type": "fs",
      "settings": {
          "location": "/Users/hwang-yunho/Documents/es/elastic-book-snapshot-master/book_backup/agg_example",
          "compress": true 
      } 
    }'
  • 결과
    {
      "acknowledged":true
    }
  • 집계 스냅샷 복구
    curl -XPOST 'http://localhost:9200/_snapshot/apache-web-log/default/_restore'
  • 결과
    {
      "acknowledged":true
    }


apache-web-log에 문서 10,001건이 생성된 것을 확인할 수 있습니다.


참조

[엘라스틱서치 실무가이드 chap5]

블로그 이미지

사용자 yhmane

댓글을 달아 주세요

이전 포스팅에서 환경설정과 파라미터에 대하여 알아보았습니다.

이번 포스팅에선 Query DSL의 주요 쿼리에 대하여 알아보도록 하겠습니다.

Query DSL의 주요 쿼리

Match All Query

  • match_all 파라미터를 사용하여 모든 문서를 검색하는 쿼리입니다. 가장 단순한 쿼리로 일반적으로 색인에 저장된 문서를 확인할 때 사용됩니다.
    POST movie_search/_search
    {
      "query": {
          "match_all": {}
      }
    }
  • 결과는 다음과 같습니다
    { 
      "took": 68,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": { 
        "total": 63069,
        "max_score": 1,
        "hits": [
         ... 중략
      }
    }

Match Query

  • 텍스트, 숫자, 날짜 등이 포함된 문장을 형태소 분석을 통해 텀으로 분리한 후 이 텀들을 이용해 검색 질의를 수행합니다. 검색어가 분석돼야 할 경우에 사용합니다.
    POST movie_search/_search
    {
      "query": {
          "match": {
              "movieNm": "그대 장미"
          }
      }
    }
  • "그대 장미"는 2개의 텀으로 분리된 후 별도의 operator 필드가 지정되어 있지 않기 때문에 두 개의 텀을 대상으로 OR 연산을 이용해 검색을 수행합니다. 결과는 다음과 같습니다.
    { 
      "took": 48,
      "timed_out": false,
      "_shards": { 
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": { 
        "total": 50,
        "max_score": 11.7566185,
        "hits": [ 
          { 
            "_index": "movie_search",
            "_type": "_doc",
            "_id": "JD3JqmkBjjM-ebDb8AAR",
            "_score": 11.7566185,
            "_source": { 
              "movieCd": "20166602",
              "movieNm": "그대 이름은 장미(가제)",
              "movieNmEn": "",
              "prdtYear": "2016",
              "openDt": "",
              "typeNm": "장편",
              "prdtStatNm": "후반작업",
              "nationAlt": "한국",
              "genreAlt": [
                "코미디"
              ],
              "repNationNm": "한국",
              "repGenreNm": "코미디",
              "directors": [
                { 
                  "peopleNm": "조석현"
                }
              ],
              "companys": [
                {
                  "companyCd": "20124237",
                  "companyNm": "(주)엠씨엠씨"
                }
              ]
            }
          },
      ... 중략
    }

Multi Match Query

  • Match Query와 기본적인 사용 방법은 동일하나 단일 필드가 아닌 여러 개의 필드를 대상으로 검색해야 할때 사용합니다.
    POST movie_search/_search
    {
      "query": {
          "multi_match": {
              "query": "가족",
              "fields": ["movieNm", "movieNmEn"]
          }
      }
    }
  • 결과는 다음과 같습니다.
    { 
      "took": 17,
      "timed_out": false,
      "_shards": { 
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      ... 중략
    }

Term Query

  • 별도의 분석 작업을 수행하지 않고 입력된 텍스트가 존재하는 문서를 찾습니다. keyword 데이터 타입을 사용하는 필드를 검색하려면 Term 쿼리를 이용해야 합니다. 필드에 텀이 정확히 존재하지 않는 경우 검색이 되지 않고, 영문 대소문자가 다를 경우 검색이 되지 않으므로 특히 주의해야 합니다.

    POST movie_search/_search
    {
      "query": {
          "term": {
              "genreAlt": "코미디"
          }
      }
    }
  • 결과는 다음과 같습니다.

    {
      "took": 81,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 6590,
        "max_score": 2.2890944,
        "hits": [
          { 
            "_index": "movie_search",
            "_type": "_doc",
            "_id": "dDzJqmkBjjM-ebDb8PsR",
            "_score": 2.2890944,
            "_source": {
              "movieCd": "20179163",
              "movieNm": "반도에 살어리랏다",
              "movieNmEn": "I'll Just Live in Bando",
              "prdtYear": "2017",
              "openDt": "20180125",
              "typeNm": "장편",
              "prdtStatNm": "개봉예정",
              "nationAlt": "한국",
              "genreAlt": [ 
                "애니메이션",
                "코미디"
              ],
              "repNationNm": "한국",
              "repGenreNm": "애니메이션",
              "directors": [
                { 
                  "peopleNm": "이용선"
                }
              ],
              "companys": [ 
    
              ]
            }
          },
          ... 중략
    }

Bool Query

  • 관계형데이터베이스처럼 AND, OR로 묶은 여러 조건을 WHERE 절에서 사용하는데 ElasticSearch에서도 Bool Query를 통해 지원합니다. must: =, must not: !=, should: or, filter: in에 대응합니다.
    POST movie_search/_search
    {
      "query": {
          "bool": {
              "must": [
                  {
                      "term": {
                          "regGenreNm": "코미디"
                      }
                  },
                  {
                      "match": {
                          "repNationNm": "한국"
                       }
                  }
              ],
              "must_not": [
                  {
                      "match": {
                          "typeNm": "단편"
                      }
                  }
              ]
          }
      }
    }
  • 결과는 다음과 같습니다.
    { 
      "took": 31,
      "timed_out": false,
      "_shards": { 
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 459,
        "max_score": 4.009591,
        "hits": [ 
          { 
            "_index": "movie_search",
            "_type": "_doc",
            "_id": "izzJqmkBjjM-ebDb8PsR",
            "_score": 4.009591,
            "_source": { 
              "movieCd": "20177473",
              "movieNm": "비밥바룰라",
              "movieNmEn": "",
              "prdtYear": "2018",
              "openDt": "20180124",
              "typeNm": "장편",
              "prdtStatNm": "개봉",
              "nationAlt": "한국",
              "genreAlt": [ 
                "코미디"
              ],
              "repNationNm": "한국",
              "repGenreNm": "코미디",
              "directors": [
                { 
                  "peopleNm": "이성재"
                }
              ],
              "companys": [ 
                { 
                  "companyCd": "20142433",
                  "companyNm": "영화사김치(주)"
                }
              ]
            }
          },
          ... 중략
    }      

Query String

  • 엘라스틱서치에는 기본적으로 내장된 쿼리 분석기가 있습니다. 주의할 점은 기존 텀 쿼리와 다르게 공백은 연산자로 사용되지 않으며 입력된 텍스트 그대로 형태소 분석기에 전달됩니다.
    POST movie_search/_search
    {
      "query": {
          "query_string": {
              "default_field": "movieNm",
              "query": "(가정)" AND (어린이 날)"
          }
      }
    }

Prefix Query

  • 해당 접두어가 있는 모든 문서를 검색하는데 사용됩니다.

    POST movie_search/_search
    {
      "query": {
          "prefix": {
              "movieNm": "자전차"
          }
      }
    }
  • 결과는 다음과 같습니다.

    { 
      "took": 27,
      "timed_out": false,
      "_shards": { 
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": { 
        "total": 1,
        "max_score": 1,
        "hits": [ 
          { - 
            "_index": "movie_search",
            "_type": "_doc",
            "_id": "GD3JqmkBjjM-ebDb8AQS",
            "_score": 1,
            "_source": { 
              "movieCd": "20176442",
              "movieNm": "자전차왕 엄복동",
              "movieNmEn": "",
              "prdtYear": "2017",
              "openDt": "",
              "typeNm": "장편",
              "prdtStatNm": "후반작업",
              "nationAlt": "한국",
              "genreAlt": [ 
                "드라마"
              ],
              "repNationNm": "한국",
              "repGenreNm": "드라마",
              "directors": [ 
    
              ],
              "companys": [ 
    
              ]
            }
          }
        ]
      }
    }

Exists Query

  • 문서를 색인할 때 필드의 값이 없다면 필드를 생성하지 않거나 필드의 값을 null로 설정할 때가 있습니다. 이러한 데이터를 제외하고 실제 값이 존재하는 문서만 찾고 싶다면 Exists Query를 사용합니다.
    POST movie_search/_search
    {
      "query": {
          "exists": {
              "field": "movieNm"
          }
      }
    }

Wildcard Query

  • * 문자의 길의와 상관 없이 와일드 카드와 일치하는 모든 문서를 찾습니다. ? 지정된 위치의 한 글자가 다른 경우의 문서를 찾습니다.
    POST movie_search/_search
    {
      "query": {
          "wildcard": {
              "typeNm": "곤*"
          }
      }
    }
  • 결과는 다음과 같습니다.
    { 
      "took": 28,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": { 
        "total": 28,
        "max_score": 1,
        "hits": [ 
          { 
            "_index": "movie_search",
            "_type": "_doc",
            "_id": "djzJqmkBjjM-ebDb8PsR",
            "_score": 1,
            "_source": { 
              "movieCd": "20180804",
              "movieNm": "곤지암",
              "movieNmEn": "",
              "prdtYear": "2016",
              "openDt": "",
              "typeNm": "장편",
              "prdtStatNm": "개봉예정",
              "nationAlt": "한국",
              "genreAlt": [ 
                "공포",
                "호러",
                "",
                "스릴러"
              ],
              "repNationNm": "한국",
              "repGenreNm": "공포(호러)",
              "directors": [ 
                { 
                  "peopleNm": "정범식"
                }
              ],
              "companys": [ 
                { 
                  "companyCd": "2016841",
                  "companyNm": "(주)하이브미디어코프"
                }
              ]
            }
          },
          ... 중략
    }

Nested Query

  • 분산 시스템에서 SQL에서 지원하는 조인(join)과 유사한 기능을 수행하려면 엄청나게 많은 비용이 소모될 것입니다. 수평적으로 샤드가 얼마나 늘어날지 모르는 상황에서 모든 샤드를 검색해야 할 수도 있기에 때문입니다. 이러한 경우에 대비해 ES에서는 Nested Query를 제공합니다. Nested 쿼리는 Nested 데이터 타입의 필드를 검색할 때 사용합니다. Nested 타입은 문서 내부에 다른 문서가 존재할 때 사용합니다.

부가적인 검색 API

Search Shards API

  • 검색이 수행되는 노드 및 샤드에 대한 정보를 확인할 수 있습니다.

    POST movie_search/_search_shards
  • 결과를 보면 movie_search 인덱스는 1개의 노드에 저장되어 있고, 인덱스는 5개의 샤드로 나누어져 저장된 것을 확인할 수 있습니다.

    { - 
      "nodes": { - 
        "j_-O0PdJSZCu3FOfoy1ihw": { - 
          "name": "javacafe-node1",
          "ephemeral_id": "wvfnAl1fRIaLDTw7eP5FFQ",
          "transport_address": "127.0.0.1:9300",
          "attributes": { - 
            "ml.machine_memory": "8589934592",
            "xpack.installed": "true",
            "ml.max_open_jobs": "20",
            "ml.enabled": "true"
          }
        }
      },
      "indices": { - 
        "movie_search": { - 
    
        }
      },
      "shards": [ - 
        [ - 
          { - 
            "state": "STARTED",
            "primary": true,
            "node": "j_-O0PdJSZCu3FOfoy1ihw",
            "relocating_node": null,
            "shard": 0,
            "index": "movie_search",
            "allocation_id": { - 
              "id": "zo0nojo8Ri6zgmNotWD-MQ"
            }
          }
        ],
        [ - 
          { - 
            "state": "STARTED",
            "primary": true,
            "node": "j_-O0PdJSZCu3FOfoy1ihw",
            "relocating_node": null,
            "shard": 1,
            "index": "movie_search",
            "allocation_id": { - 
              "id": "KIDGgXvSQnCUsfDjSXChmQ"
            }
          }
        ],
        [ - 
          { - 
            "state": "STARTED",
            "primary": true,
            "node": "j_-O0PdJSZCu3FOfoy1ihw",
            "relocating_node": null,
            "shard": 2,
            "index": "movie_search",
            "allocation_id": { - 
              "id": "-wMfyPutQeaWjQ2V64-0cw"
            }
          }
        ],
        [ - 
          { - 
            "state": "STARTED",
            "primary": true,
            "node": "j_-O0PdJSZCu3FOfoy1ihw",
            "relocating_node": null,
            "shard": 3,
            "index": "movie_search",
            "allocation_id": { - 
              "id": "y38SDjTKRrGQnLa79TyCYw"
            }
          }
        ],
        [ - 
          { - 
            "state": "STARTED",
            "primary": true,
            "node": "j_-O0PdJSZCu3FOfoy1ihw",
            "relocating_node": null,
            "shard": 4,
            "index": "movie_search",
            "allocation_id": { - 
              "id": "McuTBAzwT8a-yk658wNY3w"
            }
          }
        ]
      ]
    }

Multi Search API

  • 여러건의 검색 요청을 통합해서 한번에 요청하고 한번에 결과를 종합해서 받을때 사용됩니다.

Count API

  • 문서 본문보다 검색된 문서의 갯수만 필요할 때 사용합니다.
    POST movie_search/_count
    {
      "query": {
          "query_string": {
              "default_field": "prdtYear",
              "query": "2017"
          }
      }
    }
  • 결과는 다음과 같습니다.
    { 
      "count": 2114,
      "_shards": { 
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      }
    }

Validate API

  • 쿼리가 유효하게 작성 됐는지 검증이 가능합니다.
    {
      "query": {
          "match": {
              "prdtYear": 2017
          }
      }
    }
  • 유효할 경우
    { 
      "_shards": { 
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "valid": true
    }
  • 유효하지 않을 경우
    { 
      "_shards": { 
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "valid": false
    }

Explain API

  • 검색 결과를 확인하면 _score를 통해 검색한 키워드와 검색 결과가 얼마나 유사한지 확인할 수 있습니다. 만약, _score 값이 어떻게 계산 됐는지 정보를 알고 싶을 경우 사용합니다.

Profile API

  • 쿼리에 대한 상세한 수행 계획과 각 수행 계획별로 수행된 시간을 돌려주므로 성능을 튜닝학나 디버깅할때 유용하게 활용됩니다.

-> 질의 결과에 대한 스코어 계산 정보를 알려면 Explain을, 질의를 실행하는 과정에서 각 샤드별로 얼마나 시간이 소요되었는지 확인하려면 Profile API를 이용합니다.

 

 

참조

  • 엘라스틱서치 실무가이드 chap4
블로그 이미지

사용자 yhmane

댓글을 달아 주세요

새로운 플랫폼을 만든다면 

이제는 모바일 환경의 발전에 따라

많은 트래픽이 몰리게 되고 관계형 데이터베이스만으로 서비스를 운영 하기는 쉽지 않은 환경이 도래 됐다.

그에 따라 redis나 elastatic search등을 많은 기업에서 도입하여 서비스를 운영하고 있다.


필자도 이미 늦은감이 있지만 ElasticSearch를 접해 보려고 한다.


먼저 설치를 해보자. 


설치 -> 예제 실습 -> 토이 프로젝트 ->  검증 -> 운영환경에 적용 



링크


https://www.elastic.co/guide/en/elasticsearch/reference/current/brew.html


위는 mac os에 대한 설치 가이드이다.


homebrew를 이용해 쉽게 설치 할 수 있다.



To install with Homebrew, you first need to tap the Elastic Homebrew repository:

brew tap elastic/tap


Once you’ve tapped the Elastic Homebrew repo, you can use brew install to install the default distribution of Elasticsearch:

brew install elastic/tap/elasticsearch-full


위 명령어를 터미널에 입력하여 주자.



설치가 완료 되면 다음과 같은 위치에 저장된다고 한다.

이제 Elastic Search를 처음 접해보는 거라 혹시 몰라 캡쳐해 두었다.



설치가 완료 되었다면, 맥 기준으로 terminal에 elasticsearch를 입력 후

정상구동이 되었다면 localhost:9200으로 접속해보자.


정상적으로 설치 되었다면,


위와 같은 설정이 나올 것이다.

물론, 클러스터네임을 수정하였기에 조금 다를 수 있다.




정상적으로 설치가 완료 되었다면 키바나를 설치해보자.

키바나는 엘라스틱에서 제공하는 데이터 시각화 프로그램이다.

잘 읽어 보면 엘라스틱서치에 색인된 데이터를 검색하거나 문서를 추가 또는 삭제하는 등의 기능을 손쉽게 구현할 수 있다고 한다.



링크


https://www.elastic.co/guide/en/kibana/7.3/brew.html


마찬가지로 homebrew를 이용하여 설치할 것이다.


To install with Homebrew, you first need to tap the Elastic Homebrew repository:

brew tap elastic/tap


Once you’ve tapped the Elastic Homebrew repo, you can use brew install to install the default distribution of Kibana:

brew install elastic/tap/kibana-full


위 명령어를 터미널에 입력하여 주자.


마찬가지로, 별 문제없이 설치될 것이다.


kibana가 정상적으로 구동 되었다면


terminal 에서 elasticsearch 실행 후 kibana를 실행해보자


kibana 명령어를 치면 된다.


그러면 아래와 같이 정상적으로 구동되는 것을 볼 수 있다.






블로그 이미지

사용자 yhmane

댓글을 달아 주세요