본문 바로가기

Elasticsearch

(14)
Elasticsearch - Mappings 문자열 - text, keyword elasticsearch 에서 문자열 타입에는 text, keyword 두 가지가 있다. 인덱스를 생성할 때 매핑에 필드를 미리 정의하지 않으면 동적 문자열 필드가 생성 될 때 text 필드와 keyword 필드가 다중 필드로 같이 생성된다. text text 타입은 입력된 문자열을 텀 단위로 쪼개어 역 색인 구조를 만든다. 보통 풀 텍스트 검색에 사용할 문자열 필드들을 text 타입으로 지정한다. text 필드에 설정가능한 옵션 들은 다음과 같다. analyzer : : 색인에 사용할 애널라이저를 입력하며 디폴트로는 standard 애널라이저 이다. 토크나이저, 토큰필터들을 따로 지정할 수 가 없으며 필요시 사용자 정의 애널라이저를 settings에 정의 해 두고 사..
Elasticsearch Settings & Mappings 모든 인덱스는 두 개의 정보 단위를 가지고 있는데 바로 settings(설정) 와 mappings(매핑) 이다. 인덱스를 처음 생성 한뒤 조회하면 설정과 매핑 정보를 확인할 수 있다. 설정 - Settings GET user_info/_setings GET user_info/_mappings 세팅이나 매핑 정보만 따로 보고 싶으면 위의 명령어로 보면 된다. 처음 인덱스를 정의하면 몇가지 정보들이 자동으로 생성되는데 샤드 수는 7.0버전부터 디폴트로 1개가 설정된다. number_of_shards, number_of_replicas 샤드 수와 리플리카는 number_of_shards , number_of_replicas 에서 설정한다. 세팅 아래의 index 아래 설정에 명시되는데 index 레벨은 생략하..
Elasticsearch + spirng boot 연동(UPDATE) 특정 데이터 필드 값을 UPDATE 해서 변경해보려고한다. DocumentApi.java : _bulkDocumentWithBulkProcessor 메소드 else if(data.getActionType().equals(BulkData.Type.UPDATE)){ bulkProcessor.add(new UpdateRequest(data.getIndexName(), data.getId()).doc(data.getJsonMap())); } 위의 코드를 추가한다. BULK API를 사용하여 ES에 여러 개의 문서를 한 번에 UPDATE 한다. UPDATE할 문서의 ID와 변경할 내용을 UpdateRequest 를 통해 지정하여 ES에 전달한다. IndexApi.java /** * 인덱스 존재여부 확인 * @pa..
Elasticsearch + spirng boot 연동(SELECT) 데이터를 조회할때 SORT를 추가해보려 한다. SortData.java @Data public class SortData { private String field; private SortOrder type; } SortOrder는 elasticsearch 라이브러리 SortOrder 클래스를 import해서 사용한다. SearchApi.java : _searchScroll 메소드에 추가한다. if(sortList != null) { for(SortData data : sortList) { searchSourceBuilder.sort(new FieldSortBuilder(data.getField()).order(data.getType())); } } 이 코드는 sortList에 있는 각 SortData 객..
Elasticsearch + spirng boot 연동(DELETE) 오늘은 자바에서 Elasticsearch 데이터를 삭제해보려고 한다. 저번 실습에서 추가한 DocumentApi.java 에 삭제를 요청하는 기능을 추가한다. DocumentApi.java private Boolean _bulkDocumentWithBulkProcessor(ArrayList bulkList, int bulkActions) { boolean terminated = false ; BulkProcessor bulkProcessor = _getBulkProcessor(bulkActions); for(BulkData data : bulkList) { if(data.getActionType().equals(BulkData.Type.CREATE)){ bulkProcessor.add(new IndexR..
Elasticsearch + spirng boot 연동(INSERT) 저번에 인덱스 해당 id로 데이터를 조회까지 해봤다. 오늘은 item 인덱스에 데이터를 INSERT 해보려고 한다. elasticsearch 에 데이터를 INSERT 하기 위해 설정 파일들을 만들었다. 데이터를 여러개에 List에 담아서 보내기 위해 Bulk를 활용한다. IndexApi.java @Slf4j public class IndexApi { private RestHighLevelClient client; public IndexApi(RestHighLevelClient client) { this.client = client; } public boolean createIndex(String indexName) { CreateIndexRequest request = new CreateIndexRequ..
Elasticsearch + spirng boot 연동(SELECT) 회사에서 spring boot 에 elasticsearch 7.14 버전을 연동하고 있어 집에서도 실습해보고싶었다. 개발환경: inteli J , java 11 , elasticsearch 7.14.2 , spring boot 일단 간단하게 elasticsearch 에서 테스트로 넣은 index 데이터를 조회해보려고 한다. ES에서 Spring boot 연동하는 방식은 여러가지 있지만 그중에 직장에서도 사용하고 있는 동일한 방법으로 해봤다. Java High Level REST Client 방식이다. High Level REST Client 는 HighLevelRestClient 로 지원하며 엘라스틱 서치에 접근할 때 리퀘스트를 빌더로 만들어서 API 통신 하는 방식이다. 리스폰스도 이미 만들어진 클래스..
Elasticsearch Query DSL 정확값 쿼리 - Exact Value Query bool : filter Elasticsearch는 정확도를 고려하는 풀 텍스트 외에도 검색 조건의 참/거짓 여부만 판별해서 결과를 가져오는 것이 가능하다. 풀 텍스트와 상반되는 이 특성을 정확값이라고 하는데 정확히 일치 하는지 여부 만을 따지는 검색이다. Exact Value 에는 term, range 와 같은 쿼리들이 속한다. 스코어를 계산하지 않기 때문에 보통 bool 쿼리의 filter 내부에서 사용하게 된다. 테스트 데이터 POST sport_5/_bulk {"index":{"_id":1}} {"message":"The quick brown fox"} {"index":{"_id":2}} {"message":"The quick brown fox ju..