루씬 숫자형 인덱싱 출력 9.3.0 기준

자바|2022. 10. 7. 03:16
728x90

아리랑 형태소 분석기 소스를 보다 루씬 간단히 색인 및 검색을 구현해보면 어떨까 싶어서 색인기랑 간단한 검색기능을 만들어봤다. (구현이라기 보단 복붙이 더 가깝지만..)

 

문자타입은 검색 질의시 잘나오나 숫자타입이 나오질 않았다. 인터넷을 대강 찾아보니 대강 아래의 형태가 나왔다. 문제는 최신버전(루씬 라이브러리 9.3.0 사용) 에서 바꼇는지 int든 long이든 double이든 등등 생성자 지원을 하지 않는다. 바이트를 지원하길래 바이트로 넣었더니 바이트로 색인된다... 일단은 모든 필드에 대해 출력이 목적이기에 구글링을 좀 더 해보았지만 딱히 답이 안보였다.

           FieldType fieldType = new FieldType();
           fieldType.setStored(true);

           Field field = new Field("age",String.valueOf(hannu.getAge()).getBytes() ,fieldType);
           document.add(field);

참고로 아래와 같이

문자형의 경우  Field.Store.YES 해당을 지원 하여 간편하게 가능 하다. 

숫자의 경우 아래와 같이 색인시 출력을 지원하지 않는다. 당연히 옵션도 기능이 없다.

document.add(new StringField("id", hannu.getId(), Field.Store.YES));

document.add(new LongPoint("age", hannu.getAge() ) );

 

해결)

열심히 구글링 하다가 그냥 소스상에서 뒤져서 해결 했다. 그냥 소스부터 찾을껄... 습관을 바꿔야 하나? 하긴 구글링이 맞는 경우도 있으니 꼭 바꿀필요까지는 없겠지만...

아무래도 최상단의 소스는 예전버전 방법 같고 최신 루씬 LIB에서는 아래와 같은 형태로 하면 되는듯 하다.

document.add( new StoredField("age",hannu.getAge())  ) ;

 

위의 3개는 인터넷에서 찾은 방법인 바이트로 넣었을때 (물론 해당블로그에서 바이트로 변환 하지는 않았다. 숫자타입 그대로 넣을 방법이 없어서 내가 바꿧다)  맨밑에는 StoredField 사용하여 숫자로 잘들어간걸 볼 수 있다. 

 

엘라스틱 검색과 엔지니어링만 미친듯이 파고들었던 지난날의 나를 반성하며 루씬도 좀 봐두면 엘라스틱 이해에 도움이 크게 될듯 하다.

 - id : [stored,indexed,tokenized,omitNorms,indexOptions=DOCS<id:a1>, stored,indexed,tokenized,omitNorms,indexOptions=DOCS<name:aa1>, stored<age:[31 31]>]
 - id : [stored,indexed,tokenized,omitNorms,indexOptions=DOCS<id:a1>, stored,indexed,tokenized,omitNorms,indexOptions=DOCS<name:aa1>, stored<age:[31 31]>]
 - id : [stored,indexed,tokenized,omitNorms,indexOptions=DOCS<id:a1>, stored,indexed,tokenized,omitNorms,indexOptions=DOCS<name:aa1>, stored<age:[31 31]>]
 - id : [stored,indexed,tokenized,omitNorms,indexOptions=DOCS<id:a1>, stored,indexed,tokenized,omitNorms,indexOptions=DOCS<name:aa1>, stored<age:11>]

 

Store.YES : 검색시 내용이 나오게함
Store.NO : 검색시 내용이 안나오게함 
Store.COMPRESS : 압축 저장 함 (글 내용이 크거나, binary 파일)

indexOptions 도 꽤 여러가지가 있다. 해당 내용은 나중에 공부좀 더하고나서 포스팅 하자.

 

Store.COMPRESS 최신기준 안보인다 YES NO 만 doc에서 확인 찾아보면 나오것지 이것도 나중에..

 

 

댓글()

elasticsearch basic auth 인증 코드

자바|2022. 10. 1. 15:16
728x90

이전 회사에서 구버전을(7.5.1) 사용하는데다 oss버전을 사용하여 인증을 딱히 신경안쓰고 쓰다가 최신 버전 할려니 인증이 필요 하다. 예전 엘라스틱 협력사 다닐때 썻던 인증 코드가 있지만 버전이 많이 올라온 만큼 다시 간단히 작성해봤다. 

 

엘라스틱 doc상 소스가 생각보다 친절하지 않아 개발이라기 보단 조합이긴 하지만 대략 이형태로 가져다 쓰면 크게 문제 없다.

 

같은거 여러번 하기 싫어서 기록성으로 남겨 둔다.

    public ElasticsearchClient getCon() throws Exception {
	//엘라스틱 초기 구동 후 생성된 인증서 그대로 쓰면 된다.
        Path caCertificatePath = Paths.get("D:/elk/elasticsearch-8.4.2/config/certs/http_ca.crt");
        CertificateFactory factory =
                CertificateFactory.getInstance("X.509");
        Certificate trustedCa;
        try (InputStream is = Files.newInputStream(caCertificatePath)) {
            trustedCa = factory.generateCertificate(is);
        }

        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        //인증에 사용할 아이디 패스워드
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("elastic", "Qa5_TIoB5I0wu+ii*syq"));
		
        KeyStore trustStore = KeyStore.getInstance("pkcs12");
        trustStore.load(null, null);
        trustStore.setCertificateEntry("ca", trustedCa);
        SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                .loadTrustMaterial(trustStore, null);
        final SSLContext sslContext = sslContextBuilder.build();
        RestClientBuilder builder =RestClient.builder(
                        new HttpHost("localhost", 9200, "https")) //ip port https
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(
                            HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setSSLContext(sslContext)
                                .setDefaultCredentialsProvider(credentialsProvider);
                    }
                });

        // Create the low-level client
        RestClient restClient = builder.build();

        // Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());

        // And create the API client
        ElasticsearchClient client = new ElasticsearchClient(transport);

        return client;
    }

중간에  아이디 패스워드의 경우 엘라스틱 초기 구동시 해당화면이 출력 된다. 

해당 가져다 써도 되고 id/pw 초기화 하여 해당 써도 된다. 로컬디버깅 용도라 그냥 그대로 사용했다.

 

'자바' 카테고리의 다른 글

Groovy 이미지 변환 코드  (0) 2023.07.30
루씬 숫자형 인덱싱 출력 9.3.0 기준  (0) 2022.10.07
vscode 이클립스 단축키 똑같이 하기  (0) 2022.08.07
알파벳 배열 만들기  (0) 2022.08.05
java stream 사용 주의할점  (0) 2022.07.28

댓글()