[Elastic Stack] 쿼리

2022. 11. 6. 01:02TIL💡/Elastic Stack

엘라스틱 서치는 검색을 위해 쿼리를 지원하는데, 크게 리프 쿼리복합 쿼리로 나눌 수 있다.

리프 쿼리는 특정 필드에서 용어를 찾는 쿼리로, 매치, 용어, 범위 쿼리 등이 있다.

반면 복합 쿼리는 쿼리를 조합해 사용되는 쿼리로, 대표적으로 논리 쿼리 등이 있다.

 

리프 쿼리 중에는 Full Text Query와 Term Level Query를 살펴본다.

 

Full Text Query와 Term Level Query

Full Text Query는 전문 검색을 하기 위해 사용되며, 전문 검색을 할 필드는 인덱스 매핑 시 텍스트 타입으로 매핑해야 한다.

GET qindex/_search
{	
	"query": {
		"match": {
        	"contents": "elastic world"
        }
    }
}

반면 Term Level Query는 정확히 일치하는 용어를 찾기 위해 사용되며, 인덱스 매핑에서 필드를 키워드 타입으로 매핑해야 한다.

GET qindex/_search
{	
	"query": {
		"term": {
        	"contents": "elastic world"
        }
    }
}

매치 쿼리

매치 쿼리는 대표적인 전문 쿼리이다. 전문 쿼리의 가장 기본이 되는 쿼리로, 전체 텍스트 중에서 특정 용어나 용어들을 검색할 때 사용한다.

매치 쿼리를 사용하기 위해서는 검색하고 싶은 필드를 알아야 한다.

그리고 매치 쿼리에서 용어들 간의 공백은 OR로 인식한다.

만약 공백이 포함된 도큐먼트를 찾는 방법은 operator라는 파라미터를 변경하면 된다.

→ "operator" : "and"

 

매치 프레이즈 쿼리

매치 쿼리와 마찬가지로 전문 쿼리의 한 종류인 매치 프레이즈 쿼리는 구를 검색할 때 사용한다.

구는 동사가 아닌 2개 이상의 단어가 연결되어 만들어지는 단어다.(단어의 순서 보장)

 

용어 쿼리

용어 쿼리는 용어 수준 쿼리의 대표적인 쿼리다. 사용 방법은 매치 쿼리와 비슷하지만, 큰 차이점이 있다.

대소문자까지 정확히 맞아야 한다.

 

용어들 쿼리

용어들 쿼리는 용어 수준 쿼리의 일종이며 여러 용어들을 검색해준다.

키워드 타입으로 매핑된 필드에서 사용해야 하며, 분석기를 거치지 않았기 때문에 대소문자도 신경 써야 한다.

 

멀티 매치 쿼리

지금까지 쿼리를 이용해 검색할 때는 반드시 필드명을 적어야 했다. 왜냐하면 엘라스틱 서치는 필드를 기준으로 찾으려는 필드를 기준으로 용어나 구절을 검색하기 때문이다. 특히 전문 검색 서비스의 경우라면 더욱 자주 직면하는 문제이다.

우리가 트럼프를 검색할 때 트럼프가 어떤 필드(블로그의 제목, 뉴스의 기사 등)에 저장되어 있는지 정확히 알 수 있을까? 이럴 경우 하나의 필드가 아닌 여러 개의 필드에서 검색을 해야 한다. 여러 개의 필드에서 검색하기 위한 멀티 매치 쿼리는 전문 검색 쿼리의 일종으로, 텍스트 타입으로 매핑된 필드에서 사용하는 것이 좋다.

필드명에 와일드 카드를 사용해 이름이 유사한 복수의 필드를 선택할 수도 있다.

GET qindex/_search
{	
	"query": {
		"multi_match": {
        	"query": mary",
            "fields": [
            	"customer_full_name",
                "customer_first_name",
                "customer_last_name"
            ]
        }
    }
}

 

필드에 가중치 두기

여러 개의 필드 중 특정 필드에 가중치를 두는 방법을 부스팅(boosting)기법이라고 하는데 멀티 매치 쿼리에서 자주 사용된다. 예를 들어, 엘라스틱을 블로그에서 검색한다고 했을 때 엘라스틱이라는 용어가 본문에 있는 것과 제목에 있는 것은 무게가 다르다.

 

가중치를 부여하고자 하는 특정 필드에 ^ 기호와 숫자를 적어주면 된다.

 

범위 쿼리

특정 날짜나 숫자의 범위를 지정해 범위 안에 포함된 데이터들을 검색할 때 사용된다.

날짜/숫자/IP 타입의 데이터는 범위 쿼리가 가능하지만 문자형, 키워드 타입의 데이터에는 범위 쿼리를 사용할 수 없다.

GET kibana_sample_data_flights/_search
{	
	"query": {
		"range": {
        	"timestamp": {
            	"gte": "2020-12-15",
                "lt": "2020-12-16"
            }
        }
    }
}
  • 날짜/시간 데이터 타입
  • 범위 데이터 타입
    • integer_range
    • float_range
    • long_range
    • double_range
    • date_range
    • ip_range
    • relation이라는 파라미터를 이용해 어떤 범위를 포함할지 결정
설명
intersects 쿼리 범위 값이 도큐먼트의 범위 데이터를 일부라도 포함하기만 하면 된다.
contains 도큐먼트의 범위 데이터가 쿼리 범위 값을 모두 포함해야 한다.
within 도큐먼트의 범위 데이터가 쿼리 범위 값 내에 전부 속해야 한다.

 

논리 쿼리

논리 쿼리는 복합 쿼리로, 앞에서 배웠던 쿼리를 조합할 수 있다.

GET kibana_sample_data_flights/_search
{	
	"_source": ["day_of_week", "customer_full_name"],
	"query": {
    	"bool": {
        	"must": [
            	{ "term": {"day_of_week": "Sunday"} },
                { "match": {"customer_full_name": "mary"} }
            ]
        }
    }
}

 

'TIL💡 > Elastic Stack' 카테고리의 다른 글

[Elastic Stack] 키바나  (0) 2022.11.09
[Elastic Stack] 로그 스태시  (0) 2022.11.08
[Elastic Search] 매핑  (0) 2022.11.05
[Elastic Stack] 인덱스와 도큐먼트  (0) 2022.11.05
[Elastic Stack] 엘라스틱의 구성요소  (0) 2022.11.05