[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