11package org .com .stocknote .domain .searchDoc .service ;
22
3+ import co .elastic .clients .elasticsearch ._types .ElasticsearchException ;
4+ import co .elastic .clients .elasticsearch .core .DeleteByQueryRequest ;
5+ import jakarta .transaction .Transactional ;
36import lombok .RequiredArgsConstructor ;
47import lombok .extern .slf4j .Slf4j ;
58import org .com .stocknote .domain .keyword .dto .KeywordRequest ;
69import org .com .stocknote .domain .searchDoc .document .KeywordDoc ;
10+ import org .com .stocknote .global .error .ErrorCode ;
11+ import org .com .stocknote .global .exception .CustomException ;
12+ import org .springframework .data .elasticsearch .client .elc .NativeQuery ;
713import org .springframework .data .elasticsearch .core .ElasticsearchOperations ;
14+ import org .springframework .data .elasticsearch .core .mapping .IndexCoordinates ;
15+ import org .springframework .data .elasticsearch .core .query .Criteria ;
16+ import org .springframework .data .elasticsearch .core .query .Query ;
817import org .springframework .stereotype .Service ;
918import org .com .stocknote .domain .member .entity .Member ;
1019
1726public class KeywordDocService {
1827 private final ElasticsearchOperations elasticsearchOperations ;
1928
20- public void save (Member member , KeywordRequest request ) {
29+ @ Transactional
30+ public void updateKeywords (Member member , KeywordRequest request ) {
31+ deleteAllKeywordsByMemberId (member .getId ());
32+ saveNewKeywords (member , request );
33+ }
34+
35+ private void deleteAllKeywordsByMemberId (Long memberId ) {
36+ try {
37+ Query deleteQuery = NativeQuery .builder ()
38+ .withQuery (q -> q
39+ .term (t -> t
40+ .field ("member_id" )
41+ .value (memberId )
42+ )
43+ )
44+ .build ();
45+
46+ elasticsearchOperations .delete (deleteQuery , KeywordDoc .class , IndexCoordinates .of ("stocknote_keyword" ));
47+ elasticsearchOperations .indexOps (KeywordDoc .class ).refresh ();
48+ } catch (Exception e ) {
49+ log .error ("Failed to delete keywords for memberId: {}" , memberId , e );
50+ throw new CustomException (ErrorCode .ENTITY_NOT_FOUND );
51+ }
52+ }
53+
54+ private void saveNewKeywords (Member member , KeywordRequest request ) {
2155 List <KeywordDoc > keywordDocs = request .getKeywords ().stream ()
2256 .map (keywordDto -> KeywordDoc .builder ()
2357 .memberId (member .getId ())
@@ -28,8 +62,10 @@ public void save(Member member, KeywordRequest request) {
2862
2963 try {
3064 elasticsearchOperations .save (keywordDocs );
65+ elasticsearchOperations .indexOps (KeywordDoc .class ).refresh ();
3166 } catch (Exception e ) {
32- log .error ("Failed to save keywords to Elasticsearch" , e );
67+ log .error ("Failed to save new keywords" , e );
68+ throw new RuntimeException ("Failed to save new keywords" , e );
3369 }
3470 }
3571}
0 commit comments