프로그래밍/ELK

Elastic search 쿼리문

장경훈 2022. 9. 23. 14:54

* Elastic search의 검색은 크게  쿼리 컨텍스트와 필터 컨텍스트로 나누어진다. 이 둘의 차이점은 쿼리 컨텍스트는 정확하게 일치하는 목록을 검색하는 것이고 필터 컨텍스트는 검색조건에 맞는지 아닌지에 대해서만 표현하는 검색 방법이다.  또한 쿼리 컨텍스트는 유사도를 기준으로 더 정확한 결과를  먼저 알려준다.

GET tmdb_5000_movie3/_search # 쿼리 컨텍스트 예시
{
  "query": {
    "match": {
      "category": "movie"
    }
  }
}
GET tmdb_5000_movie3/_search #필터 컨텍스트 예시
{
  "query": {
    "bool": {
      "filter": 
        {"term": {
          "category": "movie"
        }
      } 
    }
  }
}

위의 예시를 보면 필드 컨텍스트 같은 경우에는 bool 안에 filter가 들어가게 되어 적합한 데이터인지만 확인하고 있다. 옛날 같은 경우에는 이 쿼리 컨텍스트와 필터 컨텍스트를 명확하게 구분했지만 논리 쿼리가 나오게 되며 이 두 개를 적절하게 조합하면서 사용한다고 한다.

 

*쿼리 스트링과 쿼리 DSL

Elastic Search 에는 쿼리문을 사용하는 방법이 2가지 있는데 스트링 방식과 DSL 방식이다 DSL 방식은 1번에서 예시로 사용한 방식이며 스트링 방식은 다음과 같다

GET tmdb_5000_movie3/_search?q=name:Starwars

이런 식으로 표현하기 떄문에 url 주소에도 사용 가능하고 사용하기는 편하지만 단점으로 가독성이 많이 떨어질 수도 있다는 것이다. 따라서 나는 많이 사용하지 않을 것 같다.

3. 쿼리

*전문 쿼리 

  • 전문 쿼리는 이름 그대로 전문을 검색하기 위해 사용하는 쿼리이며 인덱스 매핑 시 텍스트 타입이 권장된다
  • 일반적으로 블로그, 기사처럼 글자가 많은 텍스트에서 특정 용어를 검색하기 위해 사용된다.
  • 주로 match 쿼리를 사용하여 검색한다
  • 전문 쿼리의 종류로는 매치, 매치 프레이즈, 멀티 매치, 쿼리 스트링 등이 있다. 

*용어 수준 쿼리

  • 용어 수준 쿼리는 전문 쿼리와 다르게 정확하게 일치하는 용어를 검색할 때 사용된다.
  • 필드는 기본적으로 키워드 타입으로 매핑한다
  • 일반적으로 숫자, 날짜, 범주형 데이터를 검색할 때 사용한다. SQL의 WHERE과 유사하다
  • 용어 수준 쿼리에는 용어 쿼리 , 퍼지 쿼리 등이 있다.

*매치 쿼리

매치 쿼리에서의 간단한 예시는 다음 코드와 같다

GET tmdb_5000_movie3/_search
{
  "_source": ["original_title"],
  "query": {
    "match": {
      "original_title": {
        "query": "star life",
        "operator": "and"
      }
    }
  }
}

위의 코드에 대해서 설명하자면 _source 부분은 현재 보려는 original_title 필드만 보이기 위해 설정하는 것이며 _source를 생략하면 모든 파라미터를 보여 준다. 이전과 다른 부분을 하나 더 보면 operator이라는 부분이 생긴 거를 볼 수 있다. 이것은 star와 life가 모두 포함된 도큐먼트를 찾아 달라는 것이며 operator를 생략하면 or 즉 둘 중 하나라도 포함되는 것들을 찾아 달라는 의미이다.

 

*용어 쿼리

용어 쿼리에서의 간단한 예시는 다음과 같다.

GET tmdb_5000_movie3/_search
{
  "_source": ["original_title"],
  "query": {
    "term": {
      "original_title": "star"
    }
  } 
}

위으 코드에 대해서 설명해보자면 original_title이 star인 것들을 모두 검색해 달라는 의미이다. 완벽하게 같은 것들을 찾아주기 때문에 대소문자를 구분해서 찾아야 한다.

 

*용어들 쿼리, 멀티 매치 쿼리

우선 간단한 예시를 먼저 보자면 다음과 같다.

GET tmdb_5000_movie3/_search
{
  "_source": ["original_title"],
  "query": {
    "terms": {
      "original_title": ["star","wars"]
    }
  }
}

위의 코드 블럭을 보면 terms 즉 용어들 쿼리로 검색하겠다는 것이며 original_title이 star 또는 wars인 것들을 모두 찾아달라는 의미이다.

 

GET tmdb_5000_movie3/_search
{
  "_source": ["original_title","tags"],
  "query": {
    "multi_match": {
      "query": "star",
      "fields": [
        "tags", 
        "original_title"
        ]
    } 
  }
}

 

위의 코드 블럭은 multi_match를 사용하여 멀티 매치 쿼리를 하는 것인데 fileds를 tag와 origianl_title로 설정함으로써 star가 존재하는 필드 중 개별 스코어가 가장 큰 값부터 볼 수 있게 된다 여기서 *과 같은 와일드카드를 사용하게 되면 유사한 필드들을 모두 검색해 볼 수 있다.  또한 필드 뒤에 ^2, ^3 등 가중치를 둬서 가장 먼저 보고 싶은 필드를 명시하는 방법도 있다.

 

 

 

우선 기본적인 검색 쿼리에 대해서 정리해 봤는데 아직 더 많은 쿼리들이 있기 때문에 아마 다음 포스팅에서 정리할 예정이다. Elastic search를 하면서 점점 재밌어지고 있는 것 같다. 최대한 빨리 ELK에 대해서 이해하고 실제로 프로젝트를 진행해 봐야겠다.

'프로그래밍 > ELK' 카테고리의 다른 글

Elastic Search 기본정리  (0) 2022.09.07
[DOCKER] ELK Stack 환경 구축하기  (0) 2022.09.06