반응형
일래스틱 서치는 일래스틱 회사 웹사이트에서 다운로드 할 수 있는 자바 바이너리 파일이다. 일래스틱 서치는 RESTful API 를 통해 모든 기능을 공개하므로 키바나 편집기에서는 이 API 를 이용하여 쿼리를 구성하고 HTTP 를 통해 서버와 통신한다.
2.1 데이터와 함께 일래스틱 서치 준비
2.1.1 온라인 서점
2.1.2 도큐먼트 인덱싱
RESTful API 를 호출하여 일래스틱 서치에 데이터를 인덱싱할 수 있다.
2.1.3 첫 도큐먼트 인덱싱
- 키바나 대시보드 > Dev Tools 페이지에 접근하여 데이터를 인덱싱한다.
- https://github.com/madhusudhankonda/elasticsearch-in-action/blob/9f292ffcb96e6a5736ae80103dc4565f204502e5/kibana_scripts/ch02_getting_started.txt
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
}
}
요청의 구성 요소
- PUT 메서드: 일래스틱 서치는 RESTful API 호출에 HTTP 프로토콜을 사용하므로 요청 URL 구문에 PUT, POST, GET, DELETE 및 기타 표준 HTTP 메서드가 필요하다.
- books 인덱스: URL의 books 부분을 인덱스라고 부른다. 즉 모든 book 도큐먼트를 수집하기 위한 버킷이다. 관계형 데이터베이스의 테이블과 유사하다.
- _doc 엔드포인트: 수행중인 작업과 연결된 경로의 상수 부분이다.
- 도큐먼트 ID: 이 URL에서 숫자 1은 도큐먼트 ID를 나타낸다.
- 요청 본문: 요청 본문은 책 데이터를 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 쿼리
- must: must 절은 쿼리의 검색 조건이 도큐먼트와 일치해야 함을 의미한다.
- must 절은 여러 쿼리 집합을 배열로 허용한다. 예를 들어 작가를 검색하는 match 쿼리와 문구를 검색하는 match_phrase 쿼리가 must 절 쿼리 집합에 포함될 수 있다.
- must_not: must_not 절에서 조건은 도큐먼트와 일치하지 않아야 한다.
- should: 반드시 일치해야하는 것은 아니지만, 일치하는 경우 관련성 점수가 올라간다.
- should 은 OR 연산자처럼 동작한다.
- 검색어가 should 쿼리와 일치하면 관련성 점수가 올라간다.
- 단어가 일치하지 않더라도 쿼리는 실패하지 않으며 해당 조건은 무시된다. should 는 결과에 영향을 주기보다 관련성 점수를 높여준다.
- 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 집계
- 메트릭 집계: sum, min, max, avg 같은 단순 집계이다.
- 버킷 집계: 날짜, 연령 그룹과 같은 간격으로 분리된 "버킷"으로 데이터를 수집하는 집계다.
- 파이프라인 집계: 다른 집계의 출력에 대해 작동하는 집계이다.
## Average rating of books - Query DSL sample
GET books/_search
{
"aggs": {
"avg_rating": {
"avg": {
"field": "amazon_rating"
}
}
}
}
- 집계를 위해 _search 엔드포인트 사용
- aggs(aggregations단축어)는 수행하려는 작업의 유형을 의미한다.
- 출력 필드에 주어진 맞춤형 이름(avg_rating)
- 평균(avg) 메트릭을 계산한다.
- "amazon_rating" 필드에서 집계를 실행한다.
반응형
'도서기록 > Elasticsearch In Action' 카테고리의 다른 글
5장 도큐먼트 작업 (1) | 2025.06.08 |
---|---|
4장 매핑 (2) | 2025.05.30 |