3 분 소요

📌 실습에 앞서 기본적인 부분 복기

✅ Query Context 와 Filter Context 의 차이

  • Query Context는 Full Text Search(전문검색)에 사용된다.
  • Filter Context는 YES/NO 조건의 바이너리 구분에 사용된다.
  • Query Context는 스코어링 계산을 수행한다.
  • Filter Context는 스코어링 계산을 수행하지 않는다.
    • 캐싱 사용 가능.
    • 응답 속도가 빠르다.

✅ term

역색인 참고 자료

--term는 SQL의 equals 절과 유사하다
SELECT * FROM TB_USER WHERE 컬럼명 = "컬럼명"

기본적으로 term은 캐릭터 필터, 애널라이저, 토큰 필터를 거쳐 나오는 결과물이라 할 수 있다. 이에반해 term 쿼리는 주어진 질의문과 저장된 텀이 정확히 일치하는 문장을 찾는다.

term으로 "name" : "cjung gglee" 라고 입력하게 되는경우에는 "cjung gglee"라는 하나의 term을 찾기 때문에 결과가 나오지 않는다. 만약 2개 이상의 term을 같이 검색하고 싶을 때는 terms 쿼리를 이용해야 한다.

✅ match

--match는 SQL의 LIKE 절과 유사하다
SELECT 컬럼명 FROM 테이블 WHERE 컬럼명 LIKE '%A%'

match 쿼리도 term 쿼리와 마찬가지로 주어진 질의문을 색인된 term과 비교해서 일치하는 도큐먼트를 검색하는 질의다. 다만 term 쿼리와 다르게 match 쿼리에서는 주어진 질의문 또한 형태소 분석을 거친 뒤 분석된 질의문으로 검색을 수행한다.

예를 들면 The And로 검색하면 매치 쿼리는 이 질의문을 형태소 분석을 거쳐서 the and로 질의문을 바꾸고 이 값을 term과 비교해서 검색한다.

그리고 기본적으로 match에 들어가는 데이터들은 or 검색으로 진행된다. 다시말하면 아래의 예에서는 Diamond 또는 Street 또는 Bartlett 라는 term으로 검색한다. 이것을 and로 바꾸고 싶은 경우에는 “operator” : “and” 옵션을 넣어주어야 한다.

GET /bank/_search
{
  "query": {
    "match": {
      "address": "Diamond Street Bartlett"
    }
  }
}

// operator 적용
GET /bank/_search
{
  "query": {
    "match": {
      "address": {
        "query" : "Diamond Street Bartlett",
        "operator" : "and" // operator를 and로 수행하면 'Diamond Street Bartlett'를 찾는다
      }
    }
  }
}

📌 문제 풀이

✅ Info

#=====================================================================================
# @since  : 2022-02-05(토)
# @author : ymkim
# @desc   : 퀴즈를 활용한 엘라스틱서치 익히기 2
#=====================================================================================

✅ 문제풀이 전 실습 데이터를 등록

#=====================================================================================
# @문제풀이   : 문제풀이  실습 데이터를 등록한다.
# @주의사항   : _bulk API를 사용하는경우  줄로 입력을해야 한다.
#=====================================================================================
POST tourcompany/customerlist/_bulk
{"index": {"_id": "1"}}
{"name": "Alfred", "phone": "010-1234-5678", "holyday_dest": "Disneyland", "departure_date": "2017/01/20"}
{"index": {"_id": "2"}}
{"name": "Huey", "phone": "010-2222-4444", "holyday_dest": "Disneyland", "departure_date": "2017/01/20"}
{"index": {"_id": "3"}}
{"name": "Naomi", "phone": "010-3333-5555", "holyday_dest": "Hawaii", "departure_date": "2017/01/10"}
{"index": {"_id": "4"}}
{"name": "Andra", "phone": "010-6666-7777", "holyday_dest": "Bora Board", "departure_date": "2017/01/11"}
{"index": {"_id": "5"}}
{"name": "Paul", "phone": "010-9999-8888", "holyday_dest": "Hawaii", "departure_date": "2017/01/10"}
{"index": {"_id": "6"}}
{"name": "Clin", "phone": "010-5555-4444", "holyday_dest": "Venice", "departure_date": "2017/01/16"}

✅ 1번 tourcompany 인덱스에서 010-3333-5555를 검색하시오

#=====================================================================================
# @문제번호   : 1
# @문제풀이   : tourcompany 인덱스에서 010-3333-5555 검색하시오.
#=====================================================================================

GET tourcompany/customerlist/_search?q="010-3333-5555"

GET tourcompany/customerlist/_search
{
  "query": {
    "match": {
      "phone": "010-3333-5555"
    }
  }
}

GET tourcompany/customerlist/_search
{
  "query": {
    "match": {
      "phone": {
        "query": "010-3333-5555",
        "operator": "and"
      }
    }
  }
}

GET tourcompany/customerlist/_search
{
  "query": {
    "match_phrase": {
      "phone": "010-3333-5555"
    }
  }
}

✅ 2번 휴일 여행을 디즈니랜드로 떠나는 사람들의 핸드폰 번호만 검색

#=====================================================================================
# @문제번호   : 2
# @문제풀이   : 휴일 여행을 디즈니랜드로 떠나는 사람들의 핸드폰 번호만 검색한다.
#=====================================================================================

GET tourcompany/_search?q="Disneyland"&_source=phone,holyday_dest
GET tourcompany/_search
{
  "query": {
    "match": {
      "holyday_dest": "Disneyland"
    }
  },
  "_source": "phone"
}

✅ 3번 departure date가 2017/01/10 과 2017/01/11 인 사람을 조회

#=====================================================================================
# @문제번호   : 3
# @문제풀이   : departure date가 2017/01/10  2017/01/11  사람을 조회하고   순으로 출력한다
#               (name과 departure date 필드만 출력)
#=====================================================================================

GET tourcompany/customerlist/_search?q="2017/01/10" or "2017/01/11"&sort=name.keyword

✅ 4번 BoraBora 여행은 공항테러 사태로 취소, BoraBora 여행자의 명단 삭제

#=====================================================================================
# @문제번호   : 4
# @문제풀이   : BoraBora 여행은 공항테러 사태로 취소됐습니다. BoraBora 여행자의 명단을 삭제해주십시오.
#=====================================================================================

GET tourcompany/customerlist/_search
GET tourcompany/customerlist/_search?q=Bora Bora
POST tourcompany/customerlist/_delete_by_query?q=Bora Bora

✅ 5번 Hawaii 단체 관람객의 요청으로 출발일 조정

#=====================================================================================
# @문제번호   : 5
# @문제풀이   : Hawaii 단체 관람객의 요청으로 출발일이 조정됐습니다. 2017/01/10 출발하는 Hawaii의 출발일을
#               2017/01/17일로 수정해주십시오.
#=====================================================================================

GET tourcompany/customerlist/_search?q=Hawaii

# UPDATE Query
POST tourcompany/customerlist/_update_by_query
{
  "script": {"inline": "ctx._source.departure_date='2017/01/17'", "lang": "painless"},
  "query": {
    "bool": {
      "must": [
        {"match": {"departure_date": "2017/01/10"}},
        {"match": {"holyday_dest": "Hawaii"}}
      ]
    }
  }
}

참고 자료

댓글남기기