하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.
예를들어
- 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청
와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다.
한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.
- A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms) - B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms 시점에 작업 완료(요청에서 종료까지 : 11ms) - C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)
이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(= (3 + 11 + 16) / 3)가 됩니다.
하지만 A → C → B 순서대로 처리하면
- A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms) - C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms) - B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)
이렇게 A → C → B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.
각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법(포인트3)으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다) 포인트1
제한 사항
jobs의 길이는 1 이상 500 이하입니다.
jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다. 포인트2
입출력 예
jobsreturn
[[0, 3], [1, 9], [2, 6]]
9
입출력 예 설명
문제에 주어진 예와 같습니다.
0ms 시점에 3ms 걸리는 작업 요청이 들어옵니다.
1ms 시점에 9ms 걸리는 작업 요청이 들어옵니다.
2ms 시점에 6ms 걸리는 작업 요청이 들어옵니다.
프로그래머스 힙 디스크 컨트롤러 레벨3의 문제.
저는 1년차 같은 10년차 개발자라 그런지...
이 문제 시간제한 있는 상황이라면 저는 무조건 탈락할것 같네요.
문제가 길어서 이해하기도 쉽지 않을뿐더러(책을 많이 읽다보니, 글 읽을때 대각선으로 속독하는 버릇이 있어서...ㅠㅠ)
시간제한 때문에 긴장도 해서 뇌근육이 굳을지도?!
일단 위는 복붙, 그 중 포인트는 '소수점 이하의 수는 버립니다'
포인트1 : 이 부분이 눈에 안뛰어서 코드를 짜고서 어 뭐지 왜 안대지? 될 코드인데...한참 고민한...
포인트2 : 디스크가 작업을 안하면 먼저 요청이 온 애들을 넣는다라...2초에 작업이 끝나서 5초에 작업이 1개만 들어왔으면 모를까, 3개가 들어왔다면 걔중에서도 선별을 해줘야 하겠죠?
포인트3 : 동시간 요청에 1초 간격의 작업 3개가 들어왔다고 가정!
{{0, 3}, {0, 4}, {0, 5}}
작업시간 순 정렬시 3 + 7 + 12, 역순시 5 + 9 + 17
딱 봐도 동시간 요청은 작업시간이 낮은 순으로 정렬해주는게 좋을듯.
요 세가지를 생각하며 코딩했지만, 의외로 놓치는 부분이 생겨서...
점프 구간 부분을 생각을 못 해서...좀 헤맨 ㅠ
(저 아래 주석 처리한 부분)
코드에 주석을 잘 하는편은 아닌데,
저도 좀 헷갈려서 혹시 모를 보시는분을 위해 배려 차원에서 주석을 했습니다.
계산을 위해 지정해야하는 변수가 좀 헷갈릴뿐, 전체적인 난이도는 그다지 높지 않은듯 합니다.
가장 중요한건 요구사항에 맞게 정렬만 하면 되는일인데, 막상 정렬 하고서도 위 부분땜에 고생했네요.
package com.test.heap;
import java.util.Arrays;
import java.util.PriorityQueue;
public class Heap2 {
public static void main(String[] args) {
int[][] arr = {{0,3}, {1,9}, {2,6}};
// int[][] arr = {{0,3}, {1,3}, {1,3}, {1,3}, {15,3}};
int r = solution(arr);
System.out.println(r);
}
public static int solution(int[][] jobs) {
PriorityQueue<Total> ts = new PriorityQueue<>();
PriorityQueue<Wait> ws = new PriorityQueue<>();
// 배열을 우선순위 큐로 변환
Arrays.stream(jobs).forEach(job -> {
Total t = new Total(job);
ts.add(t);
});
ws.add(new Wait(ts.poll()));
// 흐른시간
int totTime = 0;
// sum(각 프로세스별 처리시간 = 기다린시간 + 일한시간)
int totProcessTime = 0;
while(!ws.isEmpty()) {
Wait w = ws.poll();
// 기다린시간
int waitTime = 0;
// 점프한시간(흐른 시간을 위해)
int jumptime = 0;
if(w.getInterruptTIme() > totTime) { // 요청시간이 흐른 시간보다 미래인 경우
waitTime = 0; // 대기는 0보다 작을 수 없으니까
jumptime = w.getInterruptTIme() - totTime; // 흐른시간을 계산하기 위해 미래를 현재로 만들기 위한 점프 구간
}else { // 대기를 0초 이상 한 경우
waitTime = totTime - w.getInterruptTIme();
}
// 처리시간 = 기다린시간 + 일한시간
int processTime = waitTime + w.getWorkingTime();
// 흐른시간 = 기존흐른시간 + 일한시간 + 점프한시간
totTime += w.getWorkingTime() + jumptime;
totProcessTime += processTime;
while((!ts.isEmpty() && ts.peek().getInterruptTIme() <= totTime) // 총대기열이 있고, 흐른시간안에(처리하는동안 or 과거에) 요청이 온 경우가 있을때
|| !ts.isEmpty() && ws.isEmpty()) { // 처리대기열이 비었는데, 총대기열이 남은 경우 (미래작업이 있는 경우)
ws.add(new Wait(ts.poll()));
}
}
// return (int)Math.round((double)totProcessTime/jobs.length);
return totProcessTime/jobs.length;
// int answer = 0;
//
// PriorityQueue<Total> ts = new PriorityQueue<>();
//
// PriorityQueue<Wait> ws = new PriorityQueue<>();
//
// Arrays.stream(jobs).forEach(job -> {
// Total t = new Total(job);
// ts.add(t);
// });
//
// ws.add(new Wait(ts.poll()));
//
//
// int totTime = 0;
//
// int lastEndTime = 0;
// while(!ts.isEmpty() || !ws.isEmpty()) {
// Wait w = ws.peek();
//
// int waitTime = lastEndTime - w.getInterruptTIme();
// waitTime = waitTime < 0 ? 0 : waitTime;
// int processTime = waitTime + w.getWorkingTime();
//
// if(lastEndTime > totTime) {
// lastEndTime += w.getWorkingTime();
// ws.remove();
// answer += processTime;
// }
//
// while(!ts.isEmpty() && ts.peek().getInterruptTIme() <= totTime) {
// ws.add(new Wait(ts.poll()));
// }
// totTime++;
//
// }
//
//
// return answer/jobs.length;
}
}
// 전체대기열
class Total implements Comparable<Total>{
private int interruptTIme;
private int workingTime;
Total (int[] job){
this.interruptTIme = job[0];
this.workingTime = job[1];
}
public int getInterruptTIme() {
return interruptTIme;
}
public int getWorkingTime() {
return workingTime;
}
// 1. 들어온시간 2. 일하는시간
@Override
public int compareTo(Total o) {
if(this.getInterruptTIme() == o.getInterruptTIme()) {
return this.getWorkingTime() - o.getWorkingTime();
}else {
return this.getInterruptTIme() - o.getInterruptTIme();
}
}
}
// 진행대기열
class Wait implements Comparable<Wait>{
private int interruptTIme;
private int workingTime;
Wait (Total t){
this.interruptTIme = t.getInterruptTIme();
this.workingTime = t.getWorkingTime();
}
public int getInterruptTIme() {
return interruptTIme;
}
public int getWorkingTime() {
return workingTime;
}
// 1. 일하는 시간
@Override
public int compareTo(Wait o) {
return this.getWorkingTime() - o.getWorkingTime();
}
}
-> Downloading file:///elastic\elasticsearch-7.1.1/elasticsearch-chosungPlugin-7.1.1.zip
[=================================================] 100%??
Exception in thread "main" java.nio.file.NoSuchFileException: C:\elastic\elasticsearch-7.1.1\plugins\.installing-9326766450384708165\plugin-descriptor.properties
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:235)
at java.base/java.nio.file.Files.newByteChannel(Files.java:373)
at java.base/java.nio.file.Files.newByteChannel(Files.java:424)
at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:420)
at java.base/java.nio.file.Files.newInputStream(Files.java:158)
at org.elasticsearch.plugins.PluginInfo.readFromProperties(PluginInfo.java:156)
at org.elasticsearch.plugins.InstallPluginCommand.loadPluginInfo(InstallPluginCommand.java:714)
at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:793)
at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:776)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
plugin-descriptor.properties 가 필요한가봐요...
아 이건 뭐지 하고 한참을 찾아보니...
위 글 내용의 ES 버전을 보니 0.17.1...뚜둥!!
정확히 몇 버전 부터 인지는 모르나, plugin 설치시 해당 내용에는 plugin-descriptor.properties 이게 있어야 하더라고요!
파일 이름을 plugin-descriptor.properties로 했어야 했는데 plugin-descrptor.properties로 했더라...는 전설이
(또한 zip압축시 루트에 존재하지 않고 폴더를 하나 지니고 있을 경우 동일한 에러발생)
여튼 이 문제는 지나고 나니!
C:\elastic\elasticsearch-7.1.1\bin>elasticsearch-plugin.bat install file:///elastic\elasticsearch-7.1.1/chosung-plugin-1.0.zip
-> Downloading file:///elastic\elasticsearch-7.1.1/chosung-plugin-1.0.zip
[=================================================] 100%??
Exception in thread "main" java.lang.IllegalArgumentException: property [classname] is missing for plugin [chosung-plugin]
at org.elasticsearch.plugins.PluginInfo.readFromProperties(PluginInfo.java:192)
at org.elasticsearch.plugins.InstallPluginCommand.loadPluginInfo(InstallPluginCommand.java:714)
at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:793)
at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:776)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
C:\elastic\elasticsearch-7.1.1\bin>elasticsearch-plugin.bat install file:///elastic\elasticsearch-7.1.1/chosung-plugin-1.0.zip
-> Downloading file:///elastic\elasticsearch-7.1.1/chosung-plugin-1.0.zip
[=================================================] 100%??
Exception in thread "main" java.lang.IllegalArgumentException: Unknown properties in plugin descriptor: [plugin]
at org.elasticsearch.plugins.PluginInfo.readFromProperties(PluginInfo.java:233)
at org.elasticsearch.plugins.InstallPluginCommand.loadPluginInfo(InstallPluginCommand.java:714)
at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:793)
at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:776)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
이번에는 해당 프로퍼티 안에 정의된 내용이 문제가 있는 친절한 설명입니다.
1. 플러그인으로 사용될 classname을 지정해야 함.
2. plugin 이라는 프로퍼티는 모르는놈이다...(모르는놈이면 그냥 안쓰면 그만 아닌가...)
여튼 두가지 친절한 로그로 인해 수정 후 다시 시도~
C:\elastic\elasticsearch-7.1.1\bin>elasticsearch-plugin.bat install file:///elastic\elasticsearch-7.1.1/chosung-plugin-1.0.zip
-> Downloading file:///elastic\elasticsearch-7.1.1/chosung-plugin-1.0.zip
[=================================================] 100%??
Exception in thread "main" java.lang.IllegalStateException: failed to load plugin chosung-plugin due to jar hell
at org.elasticsearch.plugins.PluginsService.checkBundleJarHell(PluginsService.java:524)
at org.elasticsearch.plugins.InstallPluginCommand.jarHellCheck(InstallPluginCommand.java:765)
at org.elasticsearch.plugins.InstallPluginCommand.loadPluginInfo(InstallPluginCommand.java:728)
at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:793)
at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:776)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
Caused by: java.lang.IllegalStateException: jar hell!
"어휴 이건 또 뭐지 jar hell? jar 지옥?ㅋㅋㅋ"
이 부분은 여러글을 찾아보니...대강 짐작이 가서 ...
위에 빌드시 depency 한 luncene jar가 두개 존재하는데...
이게 이미 es에서 존재하고 사용중인거라 필요가 없다는 내용인듯했다.
근데 나는 zip 을 만들때 include로 chosung-plugin-1.0.jar만 지정 했는데도,
이게 들어와 있으니, 영문을 모를 따름... ㅎㅎ
그냥 압축 해제 후 두개의 jar를 포함하지 않은 상태로 다시 zip으로 압축했네요.
(반디집으로 ㅋㅋ)
여튼 이후 플러그인 설치는 잘 된듯 하고!
ES를 구동하니...
[2019-08-01T16:46:48,649][INFO ][o.e.e.NodeEnvironment ] [KYN-PC] using [1] data paths, mounts [[(C:)]], net usable_space [91.1gb], net total_space [237.8gb], types [NTFS]
[2019-08-01T16:46:48,668][INFO ][o.e.e.NodeEnvironment ] [KYN-PC] heap size [989.8mb], compressed ordinary object pointers [true]
[2019-08-01T16:46:48,676][INFO ][o.e.n.Node ] [KYN-PC] node name [KYN-PC], node ID [w79MYvdUQguvtunBL1Vrgw], cluster name [elasticsearch]
[2019-08-01T16:46:48,680][INFO ][o.e.n.Node ] [KYN-PC] version[7.1.1], pid[7744], build[default/zip/7a013de/2019-05-23T14:04:00.380842Z], OS[Windows 10/10.0/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/12.0.1/12.0.1+12]
[2019-08-01T16:46:48,685][INFO ][o.e.n.Node ] [KYN-PC] JVM home [C:\elastic\elasticsearch-7.1.1\jdk]
[2019-08-01T16:46:48,687][INFO ][o.e.n.Node ] [KYN-PC] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=C:\Users\comyn\AppData\Local\Temp\elasticsearch, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m, -Djava.locale.providers=COMPAT, -Dio.netty.allocator.type=unpooled, -Delasticsearch, -Des.path.home=C:\elastic\elasticsearch-7.1.1, -Des.path.conf=C:\elastic\elasticsearch-7.1.1\config, -Des.distribution.flavor=default, -Des.distribution.type=zip, -Des.bundled_jd=true]
[2019-08-01T16:46:51,086][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [KYN-PC] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.ClassCastException: class com.mmv.chosung.ChosungPlugin
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.1.1.jar:7.1.1]
Caused by: java.lang.ClassCastException: class com.mmv.chosung.ChosungPlugin
at java.lang.Class.asSubclass(Class.java:3646) ~[?:?]
at org.elasticsearch.plugins.PluginsService.loadPluginClass(PluginsService.java:581) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:555) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:471) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:163) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.node.Node.<init>(Node.java:308) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.node.Node.<init>(Node.java:252) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:211) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:211) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:325) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.1.1.jar:7.1.1]
... 6 more
어 classcastexception??
아 위에서 간과한 문제란 비슷한거 같은데...
plugin 클래스 만들때 AbstractModule를 상속받은게 원인이 아닌가 싶더군요.
AbstractModule는 상당히 과거부터 존재했던 클래스인데...용도가 어디인지 모르겠지만...
다른걸 찾아보기로 하고...
두번째 영어 포스팅을 보면 extends Plugin을 사용한걸 확인 할 수 있어요.
문제는 이건 목적에 맞는 인터페이스를 상속받어야 한다는건데...
얘네들 전부가 관련 플러그인...음 이중에 누가 봐도 AnalysisPlugin...이겠지
문제는 또 이걸 어찌 쓰나 찾어봐야해서..
해당 부분은 너무 친절하게 잘 설명 되어있다..ㅎㅎ
getCharFilters, getTokenFilters, getTokenizers 등 다양하게 있는데,
나는 토큰필터 니까...그냥 저대로 쓰면 될듯..
그래서 나도 똑같이...
public class ChosungPlugin extends Plugin implements AnalysisPlugin{
@Override
public Map<String, AnalysisProvider<TokenFilterFactory>> getTokenFilters() {
return singletonMap("chosung_filter", JamoTokenFilterFactory::new);
}
}
이렇게 하면 ES안에서 필터이름은 chosung_filter로 사용하면 된겠지비...
어휴 이제 다시 한번 zip파일을 만들고...
플러그인 설치하니... jar hell 다시 오류나고...압축해제 후 루씬 관련 jar 제외한 상태로 다시 압축~~
설치 후 ES 가동!
근데 이 필터가 정말 잘 작동할까 의심을 하며, 티몬 김광문님의 블로그에 있는 스크립트를 돌려 보았다!
ES 버전차이가 있어서 아주 약간 수정만 하면 되는데 여튼 잘 된다~!!
이제 이걸 운영서버에 반영만 하면 될듯!!
도움되는 글을 남겨주신 티몬의 김광문님 포함 외국인 형아들에게 감사를 표하며, 그럼 안녕.
spring.io 에 보면 어지간한 저장소와 연결할 수 있는 spring-data 프로젝트가 있더군요!
음...그래서 이것저것 막 삽질해보는데...뭐가 버전이 안맞고 안되고..어휴 ㅠㅠ
maven에서 jar 참조하는 버전을 변경하고 해보는데도..안되고... 어휴 ㅠㅠ
es에 비해 버전업이 너무 느려 ㅠㅠ
es 버전을 7.1.1을 사용하는데...
결국 대강 JPA 흉내라도 내보자는 심산으로...만들어 봐야겠다~~
결심
일단 PO인 도메인(이하 Docu)부터 생성...
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@lombok.ToString
@Document(indexName="zipcode")
public class DocuZipcode implements Serializable{
/**
*
*/
private static final long serialVersionUID = -3670872846932659171L;
@Id
public String buildingControlNumber;
public String lawTownCode;
public String city;
public String ward;
public String town;
public String lee;
public String isMountaion;
public String jibun;
public String jibunSub;
public String roadCode;
public String road;
public String isUnderground;
public String buildingNumber;
public String subBuildingNumber;
public String buildingName;
public String buildingNameDetail;
public String dongNumber;
public String dongCode;
public String dongName;
public String zipcode;
public String zipcodeNumber;
public String massDlvr;
public String moveReasonCode;
public String stdnDate;
public String preRoadName;
public String cityBuildingName;
public String isPublic;
public String newZipCode;
public String idDetailAddr;
public String etc1;
public String etc2;
public String message;
public String path;
public String host;
}