본문 바로가기

전체 글

(215)
[ElasticSearch] 5. 분석기(Analyzer)와 토크나이저, 필터 분석기(Analyzer) 엘라스틱 서치는 전문 검색을 지원하기 위해 역인덱싱을 지원한다. 전문 검색은 장문 문자열에서 부분 검색을 수행하는 것이며, 이 장문의 문자열을 작은 단위(Token)으로 쪼개는 것을 역인덱싱이라고 한다. 양질의 결과를 위해, 문자열을 나누는 기준이 중요하며(지금까지의 예제인 standard는 일부분이긴 하지만 “ “공백으로 나눴다.), 이를 위해 ‘캐릭터 필터’, ‘토크나이저’, ‘토큰 필터’ 로 구성된 분석기 모듈을 가지고 있다. 캐릭터 필터 : 옵션 토크나이저 : 반드시 포함 토큰 필터 : 옵션 개념과 이해 분석기의 역할은 크게 두 부분으로 나눌 수 있다: 인덱싱 시: 도큐먼트를 인덱스에 추가할 때, 분석기는 텍스트 필드를 토큰으로 분리하고, 필요한 경우 추가적인 처리(예: ..
1620 - 나는야 포켓몬 마스터 이다솜(S4) 문제 https://www.acmicpc.net/problem/1620 풀이 Entry를 통해 전부 찾기보다는, TC가 10만개선이기 때문에 HashMap을 두 개 확보하여 GET을 통해 출력하게 하였다. try-catch문 사용하여 랜덤 문자열을 구분하였음. 코드 import java.util.*; import java.io.*; public class Main { static int N, M; static HashMap hm = new HashMap(); static HashMap hm2 = new HashMap(); public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new In..
1764 - 듣보잡(S4) 문제 https://www.acmicpc.net/problem/1764 풀이 HashSet으로 값을 추가한 후, contains를 사용하여 중복값을 확인. 이후 중복값은 PriorityQueue를 통해 출력하였음. Class에 Comparator를 굳이 달 필요는 없었다. 코드 import java.util.*; import java.io.*; public class Main { static int N, M; static HashSet hs = new HashSet(); static PriorityQueue pq = new PriorityQueue(); public static void main(String[] args) throws Exception { BufferedReader br = new Buf..
[ElasticSearch] 4. 필드와 멀티 필드, 인덱스 템플릿 필드와 멀티 필드 전문 검색의 경우 검색과 동시에 정렬이 필요한 경우도 있다. 이럴 경우 단일 필드 입력에 여러 하위 필드를 정의하여 사용한다. 필드 Elasticsearch의 문서는 여러 개의 필드(field)로 구성된다. 각 필드는 특정한 데이터 타입을 가진다. 예를 들면, string, integer, date 등이 있다. 매핑(mapping)에서는 각 필드의 데이터 타입, 분석 방법 등을 정의한다. { "properties": { "title": { "type": "text" } } } 멀티 필드 (Multi-field) 멀티 필드는 하나의 필드를 여러 방식으로 인덱싱하려고 할 때 사용된다. 예를 들어, 텍스트 필드가 있을 때, 한 번은 원본 텍스트로, 다른 한 번은 키워드로 인덱싱하고 싶다면 멀..
[ElasticSearch] 3. 벌크 데이터와 매핑, 데이터 타입과 문자열 처리 [ES]벌크 데이터와 매핑, 데이터 타입과 문자열 처리 벌크 데이터와 매핑 과정 벌크 데이터 벌크 데이터는 여러 개의 데이터 레코드가 모여 있는 것이다. 일반적으로 단일 작업으로 한 번에 처리될 수 있도록 모여있는 데이터 묶음으로, Elasticsearch에서는 REST API 호출 회수를 줄이고, 한번에여러 개의 인덱싱, 수정, 삭제 작업을 요청하기 위해 사용한다. 단, bulk API는 읽기 작업을 지원하지 않는다. //해당 형태는 Json처럼 보이지만, NDJSON 형태이니 유의할 것. POST /_bulk { "index" : { "_index" : "index1", "_id" : "1" } } { "field1" : "value1" } { "delete" : { "_index" : "index1..
[ElasticSearch] 2. 다이나믹 매핑, 도큐먼트 CRUD [ES]인덱싱 : 다이나믹 매핑, 도큐먼트 CRUD 공식 Docs ref: https://www.elastic.co/guide/en/elasticsearch/reference/7.11/index.html 이전 포스팅에 이어 인덱싱을 마저 확인해보자. 다이나믹 매핑 만약 인덱싱된 값에 추가 도큐먼트를 넣을때, 필드 프로퍼티가 다를 경우 엘라스틱 서치는 어떻게 동작할까? 만약 다음과 같이 구문을 작성했다 가정해보자. //1. 다른 프로퍼티 'country'의 추가 PUT index2/_doc/2 { "name" : "jane", "country" : "france" } //이 경우 기존 필드를 사용하지 않고, 새로운 프로퍼티를 추가했지만 문제없이 인덱싱이 가능하다. //2. 도큐먼트 매핑 PUT index2..
[JWT]토큰별 Header와 Cookie를 동시에 사용한 이유 이번 프로젝트에서 Spring Security와 JWT를 사용한 토큰 방식 인가 처리를 구현하였다. JWT의 Access-Token은 HTTP Header에, Refresh-Token은 HttpOnly Cookie로 설정했었다. 저번 프로젝트 회고 당시 '왜 이렇게 썼나요?' 라는 질문이 들어와 구현했던 과정의 이유에 대해 정리하고자 한다. Access Token in Header HTTP 헤더를 통한 AT 전송은 API 호출의 표준 방식이다. 이 방식은 CSRF 공격에 자연스럽게 내성을 가지며, 다양한 클라이언트(웹, 모바일, 데스크톱 애플리케이션 등)에서 일관되게 사용할 수 있다. 구체적으로는 다음과 같은 장점을 가진다. 장점 1. 플랫폼 독립성 액세스 토큰을 Header에 담으면 다양한 클라이언트 ..
WebFlux vs SSEemitter 분석 먼저 결론 둘 다 비동기, 그러나 IO 작업에서 효율의 차이 발생 (논블로킹과 블로킹) SSEEmitter: 비동기 서블릿을 사용하지만, 내부적으로는 Java의 전통적인 블로킹 I/O API를 사용할 수 있다. 따라서 I/O 작업이 길어지면 해당 작업을 수행하는 쓰레드는 블로킹될 수 있다. WebFlux: 이벤트 루프와 논블로킹 I/O를 사용합니다. 이로 인해 적은 수의 쓰레드로도 높은 동시성을 처리할 수 있고, 복잡한 로직이나 큰 규모의 애플리케이션에서는 특히 더 효율적이다. 따라서 복잡한 로직이나 높은 동시성이 필요한 경우, WebFlux가 더 효율적으로 동작할 수 있다. SeeEmitter는 비동기지만 Blocking IO이다. WebFlux와 SseEmitter 모두 비동기 처리를 지원하지만, 둘..