본문 바로가기

프로젝트

(77)
여행지 오픈 API 설명과 Elastic Search를 사용한 아이디어. 우리 팀은 주니어 개발자들을 위한 'Trip Open API'를 만들고 있다. 이 API는 기존의 공공데이터 중 여행지의 정보가 너무 부실했기 때문에, API를 사용하는 사용자들이 조금 더 확장된 기능과 편리함을 느낄 수 있도록 계획하였다. 이 과정에서 편리함과 효율성으로 생각한 것은 '추천' 과 '확장된 정보'이다. 기존 공공데이터 API의 경우 여행지명과 지역 위치, 간단한 설명과 위경도만 존재했다. 한정된 데이터였기에, Selenium을 통해 기존 데이터를 기반으로 정보를 추가적으로 스크래핑해서 관련된 음식점, 숙소, 평점 등을 추가할 예정이다. 또한 전문 검색과 키워드 단위로 나눈 '추천 키워드' 개발을 통해 명확하지 않은 개념에도 여행지를 추천할 수 있다. 기본적으로 1차 수집 데이터는 Mong..
[ElasticSearch] 7. 쿼리 개요 엘라스틱서치는 검색을 위해 리프 쿼리와 복합 쿼리를 지원한다. 리프 쿼리는 특정 필드에서 용어를 찾는 쿼리로, match / term / range 쿼리로 나뉜다. 복합 쿼리는 쿼리들을 조합해 사용하고 대표적으로 이전 포스팅에서 설명했던 논리 쿼리 등이 존재한다. 전문 쿼리와 용어 수준 쿼리 이전 시간의 keyword와 text의 차이에 대해 생각해보자. - 전문 쿼리 : 전문 검색을 위해 사용하며 필드는 매핑 시 text 타입으로 선언해야 한다. - 용어 수준 쿼리는 정확히 일치하는 용어를 찾기 위해 사용하며, keyword로 선언한다. 전문 쿼리 매치 쿼리 - 전문 검색 실행(text) 매치 쿼리는 대표적인 전문 쿼리로, 특정 필드의 용어를 검색하는데 사용한다. //1. 특정 필드 검색하기 GE..
[ElasticSearch] 6. 검색 : 컨텍스트와 쿼리, 유사도 컨텍스트 구버전의 엘라스틱서치는 쿼리 컨텍스트와 필터 컨텍스트로 구분되었다고 한다. 쿼리 컨텍스트는 질의에 대한 유사도를 계산하고 정확한 결과를 구분하고, 필터 컨텍스트는 유사도가 아닌 일치 여부에 따른 결과만을 계산했다. 두 컨텍스트의 개념에 대해 조금 더 자세히 알아보자. 쿼리 컨텍스트 - 유사도를 구분하여 검색 (ex : 스코어가 4.5인 검색 결과) - 유사도 검색 때문에 검색 속도가 상대적으로 느림 //Kibana에서 제공하는 샘플 데이터를 사용하여 쿼리컨텍스트를 실행해보자. //_search : 엘라스틱에서 제공하는 REST API GET kibana_sample_data_ecommerce/_search { "query": { "match": { //전문 검색을 위한 쿼리, 역인덱싱용 용어 검..
[ElasticSearch] 5. 분석기(Analyzer)와 토크나이저, 필터 분석기(Analyzer) 엘라스틱 서치는 전문 검색을 지원하기 위해 역인덱싱을 지원한다. 전문 검색은 장문 문자열에서 부분 검색을 수행하는 것이며, 이 장문의 문자열을 작은 단위(Token)으로 쪼개는 것을 역인덱싱이라고 한다. 양질의 결과를 위해, 문자열을 나누는 기준이 중요하며(지금까지의 예제인 standard는 일부분이긴 하지만 “ “공백으로 나눴다.), 이를 위해 ‘캐릭터 필터’, ‘토크나이저’, ‘토큰 필터’ 로 구성된 분석기 모듈을 가지고 있다. 캐릭터 필터 : 옵션 토크나이저 : 반드시 포함 토큰 필터 : 옵션 개념과 이해 분석기의 역할은 크게 두 부분으로 나눌 수 있다: 인덱싱 시: 도큐먼트를 인덱스에 추가할 때, 분석기는 텍스트 필드를 토큰으로 분리하고, 필요한 경우 추가적인 처리(예: ..
[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에 담으면 다양한 클라이언트 ..