개발/엘라스틱서치

elasticsearch. leaf query (match, term, range) [엘라스틱 스택 개발부터 운영까지]

ttoance 2023. 3. 12. 19:23

엘라스틱서치는 크게 리프 쿼리 leaf query와 복합 쿼리 compound query로 나눌 수 있다.

- leaf query는 특정 필드에서 용어를 찾는 쿼리로, 매치 match 용어 term 범위 range 쿼리 등이 있다.

- compound query는 쿼리를 조합해 사용되는 쿼리로, 논리 bool 쿼리 등이 있다.

 

[ leaf query ]

전문 쿼리 full text query와 용어 수준 쿼리 term level query의 차이점

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

> 텍스트 타입 필드에서 검색어를 찾을 때 사용한다.

> 분석기가 텍스트를 토큰화해서 전문 검색이 가능하다.

- term level query는 정확히 일치하는 용어를 찾기 위해 사용되며, 인덱스 매핑 시 필드를 키워드 타입으로 매핑해야 한다.

> 키워드, 숫자형, 범위형 타입의 필드에서 검색어 찾을때 사용한다.

> 정확히 일치하는 도큐먼트를 검색할 때 유용하다.

 

 

전문 쿼리 full text query

1. 매치 쿼리

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

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

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_full_name"],
  "query": {
    "match": {
      "customer_full_name": "Mary"
    }
  }
}

 

 

 

 

 

 

 

 

 

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_full_name"
  ],
  "query": {
    "match": {
      "customer_full_name": "mary bailey"
    }
  }
}

 

 

 

 

 

 

 

 

 

 

 

 

- mary 혹은 bailey가 포함된 도큐먼트를 찾는다.

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_full_name"
  ],
  "query": {
    "match": {
      "customer_full_name": 
        {
          "query": "mary bailey",
          "operator": "and"
        }
    }
  }
}

- operator를 통해 두 단어 모두 들어간 도큐먼트를 검색할 수 있다.

 

 

 

2. 매치 프레이즈 쿼리

- 2개 이상 연결된 단어 검색할 때 사용한다.

- 검색어에 사용된 용어들이 모두 포함되면서 용어의 순서까지 맞아야 한다.

- 매치 프레이즈 쿼리는 검색 시 많은 리소스를 요구하기 때문에 자주 사용하는 것은 좋지 않다.

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_full_name"
  ],
  "query": {
    "match_phrase": {
      "customer_full_name": "mary bailey"
    }
  }
}

용어의 순서가 바뀐 bailey mary나 중간에 다른 단어가 포함된 mary tony bailey 는 매칭되지 않는다.

 

 

 

 

3. 멀티 매치 쿼리

- 전문 검색 쿼리의 일종으로, 텍스트 타입으로 매핑된 필드에서 사용하는 것이 좋다.

- 멀티 매치 쿼리는 1개 이상의 필드에 쿼리를 요청할 수 있다.

- 개별 스코어를 각각 구한 다음에 그중 가장 큰 값을 대표 스코어로 구한다.

- 대표 스코어 선택 방식은 사용자가 결정할 수 있지만, 특별히 설정을 하지만 기본으로 가장 큰 스코어를 대표 스코어로 사용한다.

- explain 파라미터를 true로 설정하면 개별 필드의 스코어가 어떻게 계산되었는지 알 수 있다.

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_first_name", "customer_last_name", "customer_full_name"
  ],
  "query": {
    "multi_match": {
      "query": "mary",
      "fields": "customer_*_name"
    }
  },
  "explain": false
}

필드에 가중치 두기 (boosting)

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_first_name", "customer_last_name", "customer_full_name"
  ],
  "query": {
    "multi_match": {
      "query": "mary",
      "fields": [
        "customer_full_name^2",
        "customer_first_name",
        "customer_last_name"

      ]
    }
  },
  "explain": false
}

- 위의 경우 customer_first_name이나 customer_last_name 에서 얻은 스코어보다 customer_full_name에서 얻은 스코어를 2배 더 높게 측정된다.

- 대표 스코어는 각각의 필드에서 얻은 스코어 중에서 가장 큰 스코어로 정한다고 했는데, 이럴 경우 최종 대표 스코어는 customer_full_name 에서 얻은 결과를 체택할 확률이 높아진다.

 

 

 

term level query

1. 용어 쿼리 term

- 정확한 용어가 있는 경우에만 매칭이 된다.

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["customer_full_name"
  ],
  "query": {
    "term": {
      "customer_full_name": "Mary"
    }
  }
}

2. 용어들 쿼리 terms

GET kibana_sample_data_ecommerce/_search
{
  "_source": ["day_of_week"],
  "query": {
    "terms": {
      "day_of_week": ["Monday", "Sunday"]
    }
  }
}

 

 

 

 

 

 

 

range query ...  

 

 


아래 책 <엘라스틱 스택 개발부터 운영까지> 4.4절을 읽고 정리한 글입니다.

http://www.yes24.com/Product/Goods/103030516

 

엘라스틱 스택 개발부터 운영까지 - YES24

데이터를 처리하는 데 서로 잘 맞지도 않는 오픈소스 기술들을 굳이 동원해야 할까? 제각각인 오픈소스들을 통합하고 운영하느라 지친 개발자와 운영자들을 위한 솔루션! 이제 엘라스틱 스택

www.yes24.com

 

반응형