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() {