From aadaf3c278bf4c1774fcddd13ff2306532912147 Mon Sep 17 00:00:00 2001 From: Halo Dev Bot <87291978+halo-dev-bot@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:15:26 +0800 Subject: [PATCH] [release-2.17] Fix the problem of not being able to rebuild search index (#6324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is an automated cherry-pick of #6323 /assign ruibaby ```release-note 修复无法正常刷新搜索引擎的问题 ``` --- .../app/search/lucene/LuceneSearchEngine.java | 22 ++++++++++++++----- .../post/PostHaloDocumentsProvider.java | 6 +++++ .../search/lucene/LuceneSearchEngineTest.java | 7 +++--- .../post/PostHaloDocumentsProviderTest.java | 16 ++++++++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/application/src/main/java/run/halo/app/search/lucene/LuceneSearchEngine.java b/application/src/main/java/run/halo/app/search/lucene/LuceneSearchEngine.java index 73559980f..42698cc42 100644 --- a/application/src/main/java/run/halo/app/search/lucene/LuceneSearchEngine.java +++ b/application/src/main/java/run/halo/app/search/lucene/LuceneSearchEngine.java @@ -194,8 +194,11 @@ public class LuceneSearchEngine implements SearchEngine, InitializingBean, Dispo } var description = doc.get("description"); - var hlDescription = - highlighter.getBestFragment(this.analyzer, "description", description); + String hlDescription = null; + if (description != null) { + hlDescription = + highlighter.getBestFragment(this.analyzer, "description", description); + } var content = doc.get("content"); var hlContent = highlighter.getBestFragment(this.analyzer, "content", content); @@ -310,7 +313,9 @@ public class LuceneSearchEngine implements SearchEngine, InitializingBean, Dispo } doc.add(new TextField("title", haloDoc.getTitle(), YES)); - doc.add(new TextField("description", haloDoc.getDescription(), YES)); + if (haloDoc.getDescription() != null) { + doc.add(new TextField("description", haloDoc.getDescription(), YES)); + } doc.add(new TextField("content", haloDoc.getContent(), YES)); doc.add(new StringField("recycled", Boolean.toString(haloDoc.isRecycled()), YES)); doc.add(new StringField("exposed", Boolean.toString(haloDoc.isExposed()), YES)); @@ -335,7 +340,9 @@ public class LuceneSearchEngine implements SearchEngine, InitializingBean, Dispo var creationTimestamp = haloDoc.getCreationTimestamp(); doc.add(new LongField("creationTimestamp", creationTimestamp.toEpochMilli(), YES)); var updateTimestamp = haloDoc.getUpdateTimestamp(); - doc.add(new LongField("updateTimestamp", updateTimestamp.toEpochMilli(), YES)); + if (updateTimestamp != null) { + doc.add(new LongField("updateTimestamp", updateTimestamp.toEpochMilli(), YES)); + } doc.add(new StringField("permalink", haloDoc.getPermalink(), YES)); return doc; } @@ -375,8 +382,11 @@ public class LuceneSearchEngine implements SearchEngine, InitializingBean, Dispo var creationTimestamp = doc.getField("creationTimestamp").numericValue().longValue(); haloDoc.setCreationTimestamp(Instant.ofEpochMilli(creationTimestamp)); - var updateTimestamp = doc.getField("updateTimestamp").numericValue().longValue(); - haloDoc.setUpdateTimestamp(Instant.ofEpochMilli(updateTimestamp)); + var updateTimestampField = doc.getField("updateTimestamp"); + if (updateTimestampField != null) { + var updateTimestamp = updateTimestampField.numericValue().longValue(); + haloDoc.setUpdateTimestamp(Instant.ofEpochMilli(updateTimestamp)); + } // handle content later return haloDoc; } diff --git a/application/src/main/java/run/halo/app/search/post/PostHaloDocumentsProvider.java b/application/src/main/java/run/halo/app/search/post/PostHaloDocumentsProvider.java index 2579879d2..d0100c10e 100644 --- a/application/src/main/java/run/halo/app/search/post/PostHaloDocumentsProvider.java +++ b/application/src/main/java/run/halo/app/search/post/PostHaloDocumentsProvider.java @@ -2,6 +2,7 @@ package run.halo.app.search.post; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import run.halo.app.content.ContentWrapper; import run.halo.app.content.PostService; import run.halo.app.core.extension.content.Post; @@ -36,6 +37,11 @@ public class PostHaloDocumentsProvider implements HaloDocumentsProvider { // get content return paginatedOperator.list(Post.class, options) .flatMap(post -> postService.getReleaseContent(post) + .switchIfEmpty(Mono.fromSupplier(() -> ContentWrapper.builder() + .content("") + .raw("") + .rawType("") + .build())) .map(contentWrapper -> convert(post, contentWrapper)) ); } diff --git a/application/src/test/java/run/halo/app/search/lucene/LuceneSearchEngineTest.java b/application/src/test/java/run/halo/app/search/lucene/LuceneSearchEngineTest.java index 46625e558..4e73d00dc 100644 --- a/application/src/test/java/run/halo/app/search/lucene/LuceneSearchEngineTest.java +++ b/application/src/test/java/run/halo/app/search/lucene/LuceneSearchEngineTest.java @@ -2,6 +2,7 @@ package run.halo.app.search.lucene; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.assertArg; @@ -160,7 +161,7 @@ class LuceneSearchEngineTest { var gotHaloDoc = result.getHits().get(0); assertEquals("fake-id", gotHaloDoc.getId()); assertEquals("fake-title", gotHaloDoc.getTitle()); - assertEquals("fake-desc", gotHaloDoc.getDescription()); + assertNull(gotHaloDoc.getDescription()); assertEquals("fake-content", gotHaloDoc.getContent()); } @@ -169,13 +170,13 @@ class LuceneSearchEngineTest { haloDoc.setId("fake-id"); haloDoc.setMetadataName("fake-name"); haloDoc.setTitle("fake-title"); - haloDoc.setDescription("fake-desc"); + haloDoc.setDescription(null); haloDoc.setContent("fake-content"); haloDoc.setType("fake-type"); haloDoc.setOwnerName("fake-owner"); var now = Instant.now(); haloDoc.setCreationTimestamp(now); - haloDoc.setUpdateTimestamp(now); + haloDoc.setUpdateTimestamp(null); haloDoc.setPermalink("/fake-permalink"); haloDoc.setAnnotations(Map.of("fake-anno-key", "fake-anno-value")); return haloDoc; diff --git a/application/src/test/java/run/halo/app/search/post/PostHaloDocumentsProviderTest.java b/application/src/test/java/run/halo/app/search/post/PostHaloDocumentsProviderTest.java index 497816f8a..1f2771ae8 100644 --- a/application/src/test/java/run/halo/app/search/post/PostHaloDocumentsProviderTest.java +++ b/application/src/test/java/run/halo/app/search/post/PostHaloDocumentsProviderTest.java @@ -56,7 +56,23 @@ class PostHaloDocumentsProviderTest { assertEquals("fake-content", doc.getContent()); }) .verifyComplete(); + } + @Test + void shouldFetchAllIfNoContent() { + var post = createFakePost(); + when(paginatedOperator.list(same(Post.class), any(ListOptions.class))) + .thenReturn(Flux.just(post)); + when(postService.getReleaseContent(post)).thenReturn(Mono.empty()); + provider.fetchAll() + .as(StepVerifier::create) + .assertNext(doc -> { + assertEquals("post.content.halo.run", doc.getType()); + assertEquals("fake-post", doc.getMetadataName()); + assertEquals("post.content.halo.run-fake-post", doc.getId()); + assertEquals("", doc.getContent()); + }) + .verifyComplete(); } Post createFakePost() {