엘라스틱 서치에서 데이터를 paging 하여 조회할때 from과 size를 사용한다. 

from은 시작 지점을 이야기하고 size는 그 시작 지점으로 부터 몇 개의 데이터를 보여주어야 하는 건지 설정할 때 사용 되는 값이다. 그래서 계산 방법은 다음과 같다.

from : (page - 1) * size 

size : size


그럼  만약 3개씩 보여주는 페이지에서 2번째 페이지를 보여주기 위해서는 from은 3, size는 3으로 설정하면 된다.

1
2
3
4
5
6
7
8
9
GET wedul/_search
{
  "from": 3, 
  "size": 3, 
  "query": {
    "match_all": {}
  }
}
 
cs


그럼 만약 wedul 페이지를 접근하다가 다음과 같이 Document의 숫자가 10000을 넘어가게 되면 어떻게 될까? 쿼리를 사용해서 조회를 해보자.

1
2
3
4
5
6
7
8
9
GET wedul/_search
{
  "from": 9999, 
  "size": 3, 
  "query": {
    "match_all": {}
  }
}
 
cs


정상적인 결과가 나오지 않고 query_phase_execution_exception에러가 발생하고 다음과 같은 에러문구를 출력한다.

1
Result window is too large, from + size must be less than or equal to: [10000] but was [10002]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.
cs


이유가 몰까? 이유를 잘 몰라서 엘라스틱 서치 공식홈페이지 문서를 뒤져봤다. 

엘라스틱서치에서 인덱스를 생성할 때 기본적으로 하나의 노드에 5 섯개의 shard가 생성되고 그 shard는 데이터를 나누어서 저장한다. 물론 그 데이터를 복제하고 있는 primary shard도 1로 설정되는데 이는 primary shard가 한개라는 뜻이 아니라 각 shard 마다 복제 shard가 한 개씩 존재한다는 의미이다, 

다시 본점으로 돌아가서 노드에 분리되어있는 파티션 shard들에 데이터가 분산되어 들어간다. 그래서 만약 5섯개의 shard가 있는 노드에 위치한 index에서 1 ~ 10 개의 데이터를 찾는다면 각 shard에서 10개의 데이터를 찾고 모아서 정렬작업을 한 후 50개의 데이터에서 1 ~ 10까지의 데이터를  반환한다.

그럼 10000개의 데이터라면? 각 shard에서 10000개의 데이터를 가져와서 모으고 그것을 정렬할 것이다. 그래서 총 50000개 이상의 데이터를 모아야 하고 그것을 정렬해야하기 때문에 성능적인 문제를 야기할 수 있다. 그래서 엘라스틱서치의 기본 검색 제한 document의 값은 10000이고 이 설정값 이름은 max_result_window이다.

이 값은 아래의 쿼리를 사용해서 원하는 대로 50000까지 설정할 수 있다. 하지만 근본적으로 10000을 넘게 조회하게되면 많은 리소스 사용으로 성능문제를 야기할 수 있기 때문에 함부로 설정값을 바꿀것이아니라 검색을 10000개가 한번에 되지 않도록 검색조건을 잘 분할해서 지정해야한다.

1
2
3
4
PUT your_index_name/_settings
  "max_result_window" : 500000 
}
cs


참조 

https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html

https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

맥에서는 docker 설치와 운용이 쉬웠는데, 맥북이 망가지고 윈도우 컴퓨터를 사용하고 있으니 Docker 사용이 생각보다 쉽지 않았다.

그래서 저번에 Windows Subsystem for linux (ubuntu)를 설치하고 여기에 docker를 올려보면 어떨까 싶어서 도전해 보았다. 

우선 docker engine는 WSL에서 실행되지 않아서 호스트 컴퓨터에 Windows용 Docker를 설치해야한다. 그리고 나서 Linux(ubuntu)에서 실행되는 Docker 클라이언트(WSL)가  Windows에 설치된 Docker Engine 데몬으로 명령어를 보내서 운용할 수 있다.

우선 Ubuntu에 Docker를 설치해보자.

1. 우선 패키지를 업데이트 한다.

1
sudo apt-get update
cs


2. 그리고 apt에서 https를 통해 저장소를 사용할 수 있도록 패키지들을 설치한다.

1
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
cs


3. Docker의 공식 GPG키를 추가한다.

1
2
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add 
$ sudo apt-key fingerprint 0EBFCD88
cs


4. Docker를 설치한다.

1
2
$ sudo apt-get update
$ sudo apt-get install docker-ce
cs

이렇게 하면 Linux에 설치가 완료되나 Docker Engine은 WSL에서 실행되지 않으므로 윈도우와 연결해야한다.

먼저 Docker 호스트가 있는 Docker 클라이언트에게 알려주어야 하므로 다음 명령어를 사용한다.

1
2
3
4
5
$ 도커 -H localhost : 2375 이미지
 
// 매번 하기 귀찮으면 환경변수에 등록
$ export DOCKER_HOST = localhost : 2375
$ echo "export DOCKER_HOST = localhost : 2375">> ~ / .bash_profile
cs


그리고 Windows에서 데몬을 공개해주어야 정상적으로 동작한다.


이미지를 다운받아보고 docker 명령어를 사용해보면 정상적으로 연결이 되는 것을 확인할 수 있다.



https://medium.com/@sebagomez/installing-the-docker-client-on-ubuntus-windows-subsystem-for-linux-612b392a44c4

윈도우10에서 bash 셀을 사용하기 위해서 우분투 설치를 지원합니다.
회사 동료 소개로 알게된 내용을 공유합니다.

설치 과정과 사용법을 알아보겠습니다.

#설치방법
우선 Windows 기능에서 기능 켜기/끄기 설정창에 들어가 Linux용 Windows 하위 시스템을 키고 재시작을 수행합니다.



그리고 Microsoft App store에 들어가서 ubuntu를 검색하고 원하는 버전을 선택하여 설치합니다.



다운로드 받은 후 계정과 비밀번호를 설명하면 우분투를 사용할 수 있습니다.



#ssh 원격접속 설정방법
우분투를 설치 후 ssh 접속설정방법을 알아보자.

우분투 패키지 업데이트 업그레이드

sudo apt-get update sudo apt-get upgrade


ssh 설정
vi /etc/ssh/sshd_config 명령어를 통해 설정파일을 수정한다.

Port [포트번호]

ListenAddress 0.0.0.0 (접속 가능 IP 확인) PasswordAuthentication yes (패스워드 인증 허용)



키 생성
SSH 접속에 필요한 키를 /etc/bin/ssh-keygen -A 명령어를 통해 생성하고 service ssh restart 명령어를 통해 설정값을 리로드하게 한다.



원격접속툴로 접속

내가 주로 사용하는 원격접속 툴 Mobaxterm으로 접속을 해보면 성공적으로 접속되는 것을 알 수 있다.



이동하면서 사용할 윈도우 태블릿이 하나 있으면 좋을 것 같던 찰나에 회사 대리님이 사용하지 않는 dell latitude 5175를 싸게 넘겨주셨다.

lg 탭북을 샀다가 후회를 하고 중고로 판매하였기 때문에, 이번 구매에 신중을 기울였다.

가장 중점을 두었던 것은 성능이였다.

주로 내가 사용하려고 생각했던 부분은 다음과 같다.
- eclipse를 사용한 간단한 코딩
- 스프링으로 개인 프로젝트 제작
- 문서제작
- 인터넷 서핑
- 동영상 감상

먼저 개발부분에 대한 사용평은 보통이다.
간단한 eclipse 코딩은 가능하나, 스프링을 사용해서 프로젝트를 진행하기에는 조금 버벅임이 있다.

그리고

문서제작, 인터넷 서핑은 크게 문제가 없다.
ssd와 코어 m5를 탑재하고 있어서 이 정도의 사용이라면 크게 문제되지는 않는다.

마지막으로 동영상감상.

화질이 그렇게 선명하지는 않아서 좋은 퀄리티에 영화감상은 어려우나, 그럭저럭 보기 어려울 정도는 아닌 것 같다.


그리고 추가적으로 ebay를 통해서 구매한 독형 키보드 81jjh는 국내에서 판매하지 않아서 구매가 힘들었지만, 키감과 퀄리티는 진짜 최고다. (구매가격은 50달러, 배송비는 약 2만원 정도 들었다.)



결론은
- 가격에 비해 성능이 만족스럽다.
- 악세서리 구매가 국내에서 판매되지 않아 불편하다.
- AS는 안받아봤지만, 삼성처럼 제공받기에는 어려움이 있을 것 같다.
- 화질은 그닥 좋지 않다.
- 무겁다.
- 위에 기재한 내용대로 사용하실 분들이라면 추천.

독립창으로 다이얼로그 생성

새로운 독립창에  dialog를 생성하고 싶은 경우에는


다음과 같이 설정한다.


예를들어


a 라는 다이얼로그를 생성할 때, parent Shell을 null 값을 전달하며


새로운 창에 다이얼로그가 생성된다.


Dialog a = new Dialog(null);

a.open();


생성된 다이얼로그는 독립된 task bar에 아이콘을 가지게 된다.


다른 창보다 강제로 상위에 표시

a.forceActive();

a.forceFocus();


blocking 해제 방법

a.setBlockOnOpen(false);



+ Recent posts