diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java
index a9ff77a20..d746afedd 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchHitMapping.java
@@ -22,8 +22,7 @@
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.springframework.data.elasticsearch.UncategorizedElasticsearchException;
 import org.springframework.data.elasticsearch.backend.elasticsearch7.document.SearchDocumentResponse;
 import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
 import org.springframework.data.elasticsearch.core.document.Document;
@@ -45,12 +44,11 @@
  * @author Mark Paluch
  * @author Roman Puchkovskiy
  * @author Matt Gilene
+ * @author Sascha Woo
  * @since 4.0
  */
 public class SearchHitMapping<T> {
 
-	private static final Log LOGGER = LogFactory.getLog(SearchHitMapping.class);
-
 	private final Class<T> type;
 	private final ElasticsearchConverter converter;
 	private final MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext;
@@ -194,7 +192,7 @@ private Map<String, SearchHits<?>> mapInnerHits(SearchDocument searchDocument) {
 	 */
 	private SearchHits<?> mapInnerDocuments(SearchHits<SearchDocument> searchHits, Class<T> type) {
 
-		if (searchHits.getTotalHits() == 0) {
+		if (searchHits.isEmpty()) {
 			return searchHits;
 		}
 
@@ -239,7 +237,7 @@ private SearchHits<?> mapInnerDocuments(SearchHits<SearchDocument> searchHits, C
 						searchHits.getSuggest());
 			}
 		} catch (Exception e) {
-			LOGGER.warn("Could not map inner_hits", e);
+			throw new UncategorizedElasticsearchException("Unable to convert inner hits.", e);
 		}
 
 		return searchHits;
diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java
index b4e278f84..fd045a375 100755
--- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java
+++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java
@@ -2787,6 +2787,33 @@ public void shouldReturnDocumentWithCollapsedFieldAndInnerHits() {
 		assertThat(searchHits.getSearchHit(1).getInnerHits("innerHits").getTotalHits()).isEqualTo(1);
 	}
 
+	@Test // #1997
+	@DisplayName("should return document with inner hits size zero")
+	void shouldReturnDocumentWithInnerHitsSizeZero() {
+
+		// given
+		SampleEntity sampleEntity = SampleEntity.builder().id(nextIdAsString()).message("message 1").rate(1)
+				.version(System.currentTimeMillis()).build();
+
+		List<IndexQuery> indexQueries = getIndexQueries(Arrays.asList(sampleEntity));
+
+		operations.bulkIndex(indexQueries, IndexCoordinates.of(indexNameProvider.indexName()));
+
+		NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
+				.withCollapseBuilder(new CollapseBuilder("rate").setInnerHits(new InnerHitBuilder("innerHits").setSize(0)))
+				.build();
+
+		// when
+		SearchHits<SampleEntity> searchHits = operations.search(searchQuery, SampleEntity.class,
+				IndexCoordinates.of(indexNameProvider.indexName()));
+
+		// then
+		assertThat(searchHits).isNotNull();
+		assertThat(searchHits.getTotalHits()).isEqualTo(1);
+		assertThat(searchHits.getSearchHits()).hasSize(1);
+		assertThat(searchHits.getSearchHit(0).getContent().getMessage()).isEqualTo("message 1");
+	}
+
 	private IndexQuery getIndexQuery(SampleEntity sampleEntity) {
 		return new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity)
 				.withVersion(sampleEntity.getVersion()).build();