개발

Elasticsearch #2

동고킴 2020. 6. 7. 17:45
반응형

환경 설정

  • jvm.options
  • elasticsearch.yml (실행 호나경 설정)
    • cluster.name: <클러스터명>
    • node.name: <노드명>
    • path.data: [경로]
      • 색인된 데이터를 저장하는 경로를 지정. 디폴트는 엘라스틱서치가 설치된 홈 경로 아래의 data 폴더. 배열 형태로 여러개의 경로값의 입력이 가능하기 때문에 한 서버에서 디스크 여러개를 사용 가능
    • path.logs: <경로>
    • bootstrap.memory_lock: true
      • 엘라스틱서치가 사용중인 힙메모리 영역을 다른 자바 프로그램이 간섭 못하도록 미리 점유하는 설정. 엘라스틱서치는 많은 메모리를 필요로 하기 때문에 항상 true로 놓고 사용하는게 좋다.
    • http.port: <포트 번호>
    • transport.port: <포트 번호>
      • 엘라스틱서치 노드들끼리 서로 통신하기 위한 tcp 포트를 설정. default 9300
    • discovery.seed_hosts: [<호스트1>, <호스트2>, ...]
      • 클러스터 구성을 위해 바인딩 할 원격 노드의 IP 또는 도메인 주소

기본 REST API 명령어

curl -X GET "localhost:9200/_cat"
curl -X GET "localhost:9200/_cat/indices?v"
curl -X GET "localhost:9200/_all/_search?pretty"

# 기본 CRUD
curl -X GET "localhost:9200/customer/_search?pretty"
curl -X POST "localhost:9200/customer/_doc?pretty" - H "Content-Type: application/json" -d "{\"name\": \"gildong\"}"
curl -X PUT "localhost:9200/customer/_doc/1?pretty" - H "Content-Type: application/json" -d "{\"name\": \"gildong2\"}"
curl -X PUT "localhost:9200/customer/_doc/1?pretty"
curl -X PUT "localhost:9200/customer/_doc/1?pretty&filter_path=_source"
curl -X PUT "localhost:9200/customer/_doc/1?pretty&filter_path=_source.name"
curl -X DELETE "localhost:9200/customer/_doc/1?pretty"
curl -X DELETE "localhost:9200/customer?pretty"

Search API

아래 링크에서 테스트용 데이터를 다운받고 등록한다.
Sample Bulk Data

# 벌크 데이터 등록
curl -X POST "localhost:9200/bank/account/_bulk?pretty&refresh" -H "Content-Type: application/json" --data-binary "@accounts.json"

# 검색
curl -X GET "localhost:9200/bank/account/_search?pretty"
curl -X GET "localhost:9200/bank/account/_search?q=age:39&pretty"
curl -X GET "localhost:9200/bank/account/_search?q=age:<21pretty"

Response

  • took : 검색하는데 소요된 시간 (단위: ms)
  • timed_out : rjatortl tlrks chrhk duqn
  • _shards : 검색한 샤드 수 및 검색에 성공 또는 실패한 샤드의 수
  • hits : 검색 결과
    • total: 검색 조건과 일치하는 문서의 총 개수
    • max_Score: 검색 조건과 결과 일치 수준의 최댓값
    • hits : 검색 결과에 해당하는 실제 데이터들 (기본값으로 10이 설정되며, size를 통해 조절 가능)
      • _score : 해당 도큐먼트가 지정된 검색 쿼리와 얼마나 일치하는지를 상대적으로 나타내는 숫자 값이며 높을수록 관련성이 높다
    • sort : 결과 정렬 방식을 말하며 기본은 _score 내림차순(desc)이고, 다른 항목일 경우 오름차순(asc)으로 끼본 설정됨 (_score 기준일 경우 노출되지 않음)

Query DSL

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html

질의(Query) & 필터(Filter)

  • 질의(Query) : 루씬 내부의 득점(score) 알고리즘을 사용해 일치하는 결과의 점수를 계산하는 것
  • 필터(Filter) : 점수를 계산하지 않고 일치하는 것만 찾는것. 일반적으로 빠르며 캐시를 지원한다

Query Context & Filter Context

  • Query Context
    • Query Context에서 사용되는 쿼리절은 "해당 도큐먼트가 쿼리절과 얼마나 잘 일치하는가?"라는 질문에 응답하는데, 도큐먼트가 얼마나 잘 일치하는지를 스코어(_score, 관련성 점수, relevance score)로 표현한다.
  • Filter Context
    • Filter Context에서 사용되는 쿼리절은 "해당 도큐먼트가 쿼리절과 일치합니까?"라는 질문에 응답하는데, 그 대답은 true 또는 false이며 점수는 계산하지 않는다.
      curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
      {
      "query": { 
      "bool": { 
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ 
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
      }
      }
      }
      '

Scroll

RDBMS의 cursor와 같은 기능을 제공한다.

  • search 쿼리에 scroll 값을 추가한다.
  • scroll이 생성되면 엘라스틱서치는 지정한 시간만큼 search context를 유지한다.
  • 검색 시간을 고려하여 scroll 시간을 정하는게 좋다.
  • search context는 지정한 시간이 지나면 자동 소멸되지만, 데이터가 예상한 시간보다 빨리 조회 및 사용될 경우에는 직접 scroll을 삭제해주는게 좋다.
    curl -X POST "localhost:9200/customer/_search?scroll=1m&size?pretty" -H "Content-Type: application/json"
    curl -X POST "localhost:9200/_search?pretty" -H "Content-Type: application/json" -d "{\"scroll\": \"1m\", \"scroll_id\": \"AEFUAESR45SDZF4ASDFAFEEEEE49diASD\"}"
    curl -X DELETE "localhost:9200/_search/scroll" -H "Content-Type: application/json" -d "{ \"scroll_id\": \"AEFUAESR45SDZF4ASDFAFEEEEE49diASD\"}"
반응형

'개발' 카테고리의 다른 글

Elasticsearch #4  (0) 2020.06.07
Elasticsearch #3  (0) 2020.06.07
Elasticsearch #1  (0) 2020.06.07
리눅스 포트 확인  (0) 2020.06.06
유니온파인드  (0) 2019.07.20