본문 바로가기
도서기록/Elasticsearch In Action

2장 시작해보기

by 코엘리 2025. 5. 11.
반응형

일래스틱 서치는 일래스틱 회사 웹사이트에서 다운로드 할 수 있는 자바 바이너리 파일이다. 일래스틱 서치는 RESTful API 를 통해 모든 기능을 공개하므로 키바나 편집기에서는 이 API 를 이용하여 쿼리를 구성하고 HTTP 를 통해 서버와 통신한다.

2.1 데이터와 함께 일래스틱 서치 준비

2.1.1 온라인 서점

2.1.2 도큐먼트 인덱싱

RESTful API 를 호출하여 일래스틱 서치에 데이터를 인덱싱할 수 있다.

2.1.3 첫 도큐먼트 인덱싱

PUT books/_doc/1
{
  "title":"Effective Java",
  "author":"Joshua Bloch",
  "release_date":"2001-06-01",
  "amazon_rating":4.7,
  "best_seller":true,
  "prices": {
    "usd":9.95,
    "gbp":7.95,
    "eur":8.95
  }
}

요청의 구성 요소

  1. PUT 메서드: 일래스틱 서치는 RESTful API 호출에 HTTP 프로토콜을 사용하므로 요청 URL 구문에 PUT, POST, GET, DELETE 및 기타 표준 HTTP 메서드가 필요하다.
  2. books 인덱스: URL의 books 부분을 인덱스라고 부른다. 즉 모든 book 도큐먼트를 수집하기 위한 버킷이다. 관계형 데이터베이스의 테이블과 유사하다.
  3. _doc 엔드포인트: 수행중인 작업과 연결된 경로의 상수 부분이다.
  4. 도큐먼트 ID: 이 URL에서 숫자 1은 도큐먼트 ID를 나타낸다.
  5. 요청 본문: 요청 본문은 책 데이터를 JSON 으로 표현한다.

2.2 데이터 검색

2.2.1 도큐먼트 집계

  • 인덱스의 총 도큐먼트 수를 조회하는 요구 사항은 _count API 가 충족시킨다.
  • books 인덱스에서 _count 엔드포인트를 호출하면 해당 인덱스에 유지되는 도큐먼트 개수가 집계된다.

2.2.2 도큐먼트 검색

단일 도큐먼트 검색

  • 기본 키를 사용하여 DB에서 레코드를 가져오는 것과 유일하다.
  • 일반 형식은 GET <index>/_doc/<id> 이다.
  • 응답에는 _source 태그 아래 원본 도큐먼트와 이 도큐먼트의 메타데이터(index, id, version 등) 이라는 두 가지 정보가 포함된다.
    • 만약, 원본 소스만 원하는 경우 _doc 엔드포인트를 _source 로 변경해 쿼리를 다시 실행한다.

ID로 여러 도큐먼트 검색

  • 도큐먼트 집합을 검색해야하는 경우 ids 쿼리를 사용할 수 있다.
  • ids 쿼리는 _search 엔드포인트를 사용한다.
  • 응답에서 원본 소스 데이터를 제외하고 싶은 경우에는 _source 필드에 false 플래그를 설정하면 된다.
# To fetch multiple documents give a set of IDs using ids query
GET books/_search
{
  "query": {
    "ids": {
      "values": [1,2,3]
    }
  }
}
# Turn off the source 
GET books/_search
{
  "_source": false, 
  "query": {
    "ids": {
      "values": [1,2,3]
    }
  }
}

2.3 풀텍스트 검색

  • 여러 도큐먼트를 인덱싱한 후에는 특정 조건을 충족하는 도큐먼트를 찾을 수 있는 것이 중요하다.
  • 일래스틱 서치는 풀텍스트 쿼리라고 부르는 비구조화된 텍스트를 검색하는 검색 기능을 제공한다.

2.3.1 match 쿼리: 특정 저자 책 검색

  • match 쿼리는 비구조화된 텍스트나 풀텍스트에서 단어를 검색하는 데 도움이 된다.

2.3.2 AND 연산자를 사용한 match 쿼리

GET books/_search
{
  "query": {
    "match": {
      "author": "Joshua"
    }
  }
}

위 검색 결과에 대해 저자명이 Joshua Block 인 도큐먼트가 반환된다고 했을 때,
아래처럼 검색했을 때도 동일한 검색결과가 반환된다.

#Searching for different keywords will still bring the results 
GET books/_search
{
  "query": {
    "match": {
      "author": {
        "query": "Joshua Sarikonda"
      }
    }
  }
}

이유는 엔진이 Joshua 또는 Sarikonda 가 쓴 모든 책을 검색하기 때문이다. 즉, OR 연산자가 암묵적으로 사용된다.
쿼리를 조정해 operator 매개변수를 정의하고 명시적으로 AND로 다음과 같이 정의할 수 있다.

GET books/_search
{
  "query": {
    "match": {
      "author": {
        "query": "Joshua Sarikonda",
        "operator": "AND"
      }
    }
  }
}

2.3.3 _bulk API 를 사용한 도큐먼트 인덱싱

2.3.4 다중 필드 검색

  • 검색할 때 제목 필드 뿐 아니라 개요, 태그 등 같은 다른 필드에서도 동일한 단어에 대한 검색을 할 때 multi-field 검색을 활성화할 수 있다.
    # Searching across multiple fields using multi_match query
    GET books/_search
    {
    "query": {
      "multi_match": {
        "query": "Java",
        "fields": ["title","synopsis"]
      }
    }
    }

2.3.5 결과 부스팅

  • 여러 필드에 대해 쿼리를 실행할 때 특정 필드에 더 높은 우선순위(관련성)을 부여한다고 한다면 아래와 같은 부스팅을 사용할 수 있다.
    # Boosting scores
    GET books/_search
    {
    "query": {
      "multi_match": { 
        "query": "Java",
        "fields": ["title^3","synopsis"]
      }
    }
    }

2.3.6 문구 검색

특정 문구가 주어진 순서로 정확히 일련의 단어를 검색하고 싶을 때는 match_pharase 쿼리를 사용할 수 있다.

GET books/_search
{
  "query": {
    "match_phrase": {#A The match_phrase query expects a sequence of words
      "synopsis": "must-have book for every Java programmer"#B Our phrase
    }
  }
}

2.3.7 누락된 단어가 있는 문구

  • match_phrase 쿼리는 전체 문구, 즉 누락된 단어가 없는 문구를 기대한다.
  • 그러나 사용자가 항상 정확한 문구를 입력하는 것은 아니다. 이를 처리하기 위해서 match_phrase에 slop 매개변수를 설정하여, 최대 n개의 단어가 누락되거나 순서대로 정렬되지 않음을 허용할 수 있다.
    # Match Phrase query with slop 1
    GET books/_search
    {
    "query": {
      "match_phrase": {
        "synopsis": {
        "query": "must-have book every Java programmer",
        "slop": 1
        }
      }
    }
    }

2.3.8 철자 오류 처리

  • 엘라스틱서치는 철자 문제를 수용하고 이를 지원하기 위해 레벤슈타인 펼집 거리 알고리즘을 사용해 단어간의 유사성을 찾는다.
  • 일래스틱 서치는 fuzziness 설정이 포함된 match 쿼리를 사용해 맞춤법 오류를 처리한다.
#Fuzzy query (forgiving spelling mistakes)
GET books/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "kava",
        "fuzziness": 1 
      }
    }
  }
}
  • fuziness 값을 1로 설정하면 철자 오류 한 번정도는 용서 받을 수 있다.

2.4 텀 수준 쿼리

  • 숫자, 날짜, 범위, IP주소 등은 구조화된 텍스트 범주에 속한다.
  • 구조화되지 않은 데이터는 분석되는 반면, 구조화된 필드는 있는 그대로 저장한다.
  • 텀 수준 쿼리는 이진 출력을 만든다. 이러한 쿼리는 도큐먼트가 얼마나 잘 일치하는지 고려하지 않고, 일치 항목이 있는지 여부에 집중한다.

2.4.1 term 쿼리

  • 텀 쿼리는 검색 조건에 제공된 값과 정확히 일치하는 항목을 가져오는데 사용한다.

    # Getting third edition books using term query
    GET books/_search
    {
    
    "query": {
      "term": {
        "edition": {
          "value": 3
        }
      }
    }
    }

2.4.2 range 쿼리

  • range 쿼리는 범위와 일치하는 결과를 가져온다.
  • 범위 쿼리를 사용해 amazon_rating 이 별점 4.5개 이상, 별점 5개 이하인 모든 책을 가져온다.
    # Range query
    GET books/_search
    {
    "query": {
      "range": {
        "amazon_rating": {
          "gte": 4.5,
          "lte": 5
        }
      }
    }
    }

2.5 compound 쿼리

  • 일래스틱서치의 compound 쿼리는 정교한 검색 쿼리를 생성하는 메커니즘을 제공한다.
  • 리프 쿼리라고 하는 개별 쿼리를 결합해 복잡한 시나리오에 맞는 강력하고 견고한 쿼리를 구축한다.

2.5.1 bool 쿼리

  1. must: must 절은 쿼리의 검색 조건이 도큐먼트와 일치해야 함을 의미한다.
    • must 절은 여러 쿼리 집합을 배열로 허용한다. 예를 들어 작가를 검색하는 match 쿼리와 문구를 검색하는 match_phrase 쿼리가 must 절 쿼리 집합에 포함될 수 있다.
  2. must_not: must_not 절에서 조건은 도큐먼트와 일치하지 않아야 한다.
  3. should: 반드시 일치해야하는 것은 아니지만, 일치하는 경우 관련성 점수가 올라간다.
    • should 은 OR 연산자처럼 동작한다.
    • 검색어가 should 쿼리와 일치하면 관련성 점수가 올라간다.
    • 단어가 일치하지 않더라도 쿼리는 실패하지 않으며 해당 조건은 무시된다. should 는 결과에 영향을 주기보다 관련성 점수를 높여준다.
  4. filter: must 절과 유사하게 도큐먼트와 일치해야 한다. 차이점은 점수가 filter 절과 관련이 없다는 것이다.

# Adding a filter clause - drops books older than 2015
GET books/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "author": "Joshua"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "amazon_rating": {
              "lt": 4.7
            }
          }
        }
      ],
      "should": [
        {
          "match": {
            "tags": "Software"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "release_date": {
              "gte": "2015-01-01"
            }
          }
        }
      ]
    }
  }
}

2.6 집계

  1. 메트릭 집계: sum, min, max, avg 같은 단순 집계이다.
  2. 버킷 집계: 날짜, 연령 그룹과 같은 간격으로 분리된 "버킷"으로 데이터를 수집하는 집계다.
  3. 파이프라인 집계: 다른 집계의 출력에 대해 작동하는 집계이다.
## Average rating of books - Query DSL sample
GET books/_search
{
  "aggs": {
    "avg_rating": {
      "avg": {
        "field": "amazon_rating"
      }
    }
  }
}
  1. 집계를 위해 _search 엔드포인트 사용
  2. aggs(aggregations단축어)는 수행하려는 작업의 유형을 의미한다.
  3. 출력 필드에 주어진 맞춤형 이름(avg_rating)
  4. 평균(avg) 메트릭을 계산한다.
  5. "amazon_rating" 필드에서 집계를 실행한다.
반응형

'도서기록 > Elasticsearch In Action' 카테고리의 다른 글

5장 도큐먼트 작업  (1) 2025.06.08
4장 매핑  (2) 2025.05.30