[ElasticSearch] ElasticSearch 개요
2021. 12. 22. 20:02ㆍ개발일지
1. Elasticsearch 기본 개념(출처 링크)
- 한마디로 역색인(inverted index)방식으로 데이터 저장해서, 쿼리값을 포함하는 문서를 찾을 수 있게 하는 검색엔진
(1) Elasticsearch의 데이터 저장 방식
- Elasticsearch는 [특정 value, 그 value를 포함하는 document] 형식으로 데이터를 저장한다. RDBMS처럼 한 행 당 문서 하나를 저장하는게 아니라, 문서가 가진 값을 기준으로 한 행씩 저장하기 때문에 inverted index방식이라고 부른다. 역색인은 검색엔진에서 기본적으로 사용하는 데이터 저장 방식이다. 값을 기준으로 그 값을 포함하는 문서를 바로 저장했기 때문에 검색이 유리하다.

- 'database'라는 단어가 나오는 문서를 검색한다고 하자. Elasticsearch는 'database'를 key로 하는 행을 찾으면 되어서 O(1)의 시간복잡도를 가진다. 한편 관계형 데이터 베이스의 경우, 각 행은 문서로 구성되어있다. 모든 문서의 필드값을 살펴보고 'database'를 값으로 가지는지 판단해야한다. 따라서 O(N)의 시간복잡도를 가진다.

- Elasticsearch에서 사용하는 terminology를 관계형데이터베이스와 비교하여 보면 다음과 같다.



출처 링크)
2. Elasticsearch Query DSL(- Elasticsearch는 쿼리 실행에 사용할 수 있도록 JSON 스타일의 도메인 전용 언어를 제공한다. 이를 Query DSL(Domain Specific Language)이라고 한다.
- Query DSL에 대한 보다 자세한 내용은 Elasticsearch Query DSL 더보기에서 다룬다.
- RESTful API를 사용하여 쿼리를 날릴 수 있다.
# requests 라이브러리를 사용한 예시: search API 사용해서 검색 쿼리 날리는 경우
import requests, json
headers = {'Content-Type': 'application/json'}
data = {"query": { "match": { "address": "mill" } } }
data = data.encode('utf8')
response = requests.post('인덱스url/_search', headers=headers, data=data)
search_result = json.loads(response.text)
- 응답 결과 구조(json)
- took : Elasticsearch가 검색을 실행하는 데 걸린 시간(밀리초)
- timed_out : 검색의 시간 초과 여부
- _shards : 검색한 샤드 수 및 검색에 성공/실패한 샤드 수
- hits : 검색 결과
- hits.total : 검색 조건과 일치하는 문서의 총 개수
- hits.hits : 검색 결과의 실제 배열(기본 설정은 처음 10개 문서)
- hits.sort : 결과의 정렬 키(점수 기준 정렬일 경우 표시되지 않음)
# 응답 결과 예시
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1000,
"max_score" : null,
"hits" : [ {
"_index" : "bank",
"_type" : "account",
"_id" : "0",
"sort": [0],
"_score" : null,
"_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"}
}, {
"_index" : "bank",
"_type" : "account",
"_id" : "1",
"sort": [1],
"_score" : null,
"_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
}, ...
]
}
}
- 아래와 같이, search API에 explain=True를 추가하면, score가 도출된 과정을 확인할 수 있다.
- 사용한 쿼리가 점수 계산에 어떻게 사용되었는지를 확인하기 좋다.
{"query": { "match": { "address": "mill" } } , explain: true}
반응형
'개발일지' 카테고리의 다른 글
vscode tab 간격 설정 (0) | 2021.12.31 |
---|---|
cgi (common gateway interface) (0) | 2021.12.29 |
[linux] tmux 단축키 안 먹음 (0) | 2021.12.23 |
[ElasticSearch] ElasticSearch DSL 더보기 (0) | 2021.12.22 |
[git] submodule (0) | 2021.12.22 |