Pull request #4: RED-1874: Enabled to delete documents

Merge in RED/search-service from RED-1874 to master

* commit 'baa93720d72b61b5cc51cc27d5f03bbe434e17c5':
  RED-1874: Enabled to delete documents
This commit is contained in:
Dominique Eiflaender 2021-07-28 12:17:23 +02:00
commit 1389dcd8a7
5 changed files with 102 additions and 2 deletions

View File

@ -5,6 +5,7 @@ public class IndexException extends RuntimeException {
public static final String INDEX_EXISTS_ERROR = "Unable to check, if index exists";
public static final String CONTENT_TO_JSON_ERROR = "Could not convert document with id '%s' to JSON!";
public static final String DOCUMENT_INDEX_ERROR = "Error during indexing document with id '%s'";
public static final String DOCUMENT_DELETE_ERROR = "Error during deleting document with id '%s'";
public static final String FAILED_TO_SEARCH = "Error during search";

View File

@ -1,5 +1,7 @@
package com.iqser.red.service.search.v1.server.queue;
import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.DELETE_FROM_INDEX_DLQ;
import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.DELETE_FROM_INDEX_QUEUE;
import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.INDEXING_DQL;
import static com.iqser.red.service.search.v1.server.queue.MessagingConfiguration.INDEXING_QUEUE;
@ -14,6 +16,7 @@ import com.iqser.red.service.search.v1.model.IndexMessage;
import com.iqser.red.service.search.v1.server.client.FileStatusClient;
import com.iqser.red.service.search.v1.server.client.FileStatusProcessingUpdateClient;
import com.iqser.red.service.search.v1.server.model.Text;
import com.iqser.red.service.search.v1.server.service.DocumentDeleteService;
import com.iqser.red.service.search.v1.server.service.DocumentIndexService;
import com.iqser.red.service.search.v1.server.service.TextStorageService;
@ -30,6 +33,7 @@ public class IndexingMessageReceiver {
private final DocumentIndexService documentIndexService;
private final FileStatusClient fileStatusClient;
private final FileStatusProcessingUpdateClient fileStatusProcessingUpdateClient;
private final DocumentDeleteService documentDeleteService;
@RabbitHandler
@ -57,4 +61,28 @@ public class IndexingMessageReceiver {
log.info("Failed to process indexing request: {}", indexRequest);
}
@RabbitHandler
@RabbitListener(queues = DELETE_FROM_INDEX_QUEUE)
public void receiveDeleteDocumentRequest(String in) throws JsonProcessingException {
var indexRequest = objectMapper.readValue(in, IndexMessage.class);
log.info("Processing delete document request: {}", indexRequest);
documentDeleteService.deleteDocument(indexRequest.getFileId());
log.info("Successfully deleted document with dossierId {} and fileId {}", indexRequest.getDossierId(), indexRequest.getFileId());
}
@RabbitHandler
@RabbitListener(queues = DELETE_FROM_INDEX_DLQ)
public void receiveDeleteDocumentRequestDLQ(String in) throws JsonProcessingException {
var indexRequest = objectMapper.readValue(in, IndexMessage.class);
fileStatusProcessingUpdateClient.indexingFailed(indexRequest.getDossierId(), indexRequest.getFileId());
log.info("Failed to process delete from index request: {}", indexRequest);
}
}

View File

@ -14,6 +14,9 @@ public class MessagingConfiguration {
public static final String INDEXING_QUEUE = "indexingQueue";
public static final String INDEXING_DQL = "indexingDQL";
public static final String DELETE_FROM_INDEX_QUEUE = "deleteFromIndexQueue";
public static final String DELETE_FROM_INDEX_DLQ = "deleteFromIndexDLQ";
@Bean
public Queue indexingQueue() {
@ -32,4 +35,24 @@ public class MessagingConfiguration {
return QueueBuilder.durable(INDEXING_DQL).build();
}
@Bean
public Queue deleteFromIndexQueue() {
return QueueBuilder.durable(DELETE_FROM_INDEX_QUEUE)
.withArgument("x-dead-letter-exchange", "")
.withArgument("x-dead-letter-routing-key", DELETE_FROM_INDEX_DLQ)
.maxPriority(2)
.build();
}
@Bean
public Queue deleteFromIndexDLQ() {
return QueueBuilder.durable(DELETE_FROM_INDEX_DLQ).build();
}
}

View File

@ -0,0 +1,38 @@
package com.iqser.red.service.search.v1.server.service;
import static com.iqser.red.service.search.v1.server.service.IndexCreatorService.INDEX_NAME;
import java.io.IOException;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.client.RequestOptions;
import org.springframework.stereotype.Service;
import com.iqser.red.service.search.v1.server.client.ElasticsearchClient;
import com.iqser.red.service.search.v1.server.exception.IndexException;
import com.iqser.red.service.search.v1.server.settings.ElasticsearchSettings;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class DocumentDeleteService {
private final ElasticsearchClient client;
private final ElasticsearchSettings settings;
public void deleteDocument(String fileId) {
DeleteRequest request = new DeleteRequest(INDEX_NAME).id(fileId).setRefreshPolicy(settings.getRefreshPolicy());
try {
client.delete(request, RequestOptions.DEFAULT);
} catch (IOException e) {
throw new IndexException(String.format(IndexException.DOCUMENT_DELETE_ERROR, fileId), e);
}
}
}

View File

@ -1,6 +1,7 @@
package com.iqser.red.service.search.v1.server.service;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
import org.junit.Test;
@ -30,6 +31,9 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest {
@Autowired
private SearchService searchService;
@Autowired
private DocumentDeleteService documentDeleteService;
@MockBean
private FileStatusClient fileStatusClient;
@ -38,7 +42,7 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest {
@Test
public void test() throws IOException, InterruptedException {
public void test() throws IOException {
ClassPathResource textResource = new ClassPathResource("files/Text.json");
Text text = objectMapper.readValue(textResource.getInputStream(), Text.class);
@ -49,9 +53,15 @@ public class IndexCreatorTest extends AbstractElasticsearchIntegrationTest {
documentIndexService.indexDocument("dossierId", "fileId", "Single Study - Oral (Gavage) Mouse.pdf", text);
documentIndexService.indexDocument("dossierId2", "fileId2", "S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf", text2);
SearchResult result = searchService.search("hans klaus single" ,null, null, 0 , 10, true);
SearchResult result = searchService.search("hans klaus single", null, null, 0, 10, true);
assertThat(result.getMatchedDocuments().size()).isEqualTo(2);
documentDeleteService.deleteDocument("fileId");
result = searchService.search("hans klaus single", null, null, 0, 10, true);
assertThat(result.getMatchedDocuments().size()).isEqualTo(1);
}
}