From fbc7d12cc5aec430b0386f54b2e3c88db52f4304 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Mon, 16 Mar 2026 14:10:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(PortalSearchEsServiceImpl):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0ES=E7=B4=A2=E5=BC=95=E7=BC=BA=E5=A4=B1=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=87=8D=E5=BB=BA=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PortalSearchEsServiceImpl.java | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/ruoyi-portal/src/main/java/com/ruoyi/portal/search/service/impl/PortalSearchEsServiceImpl.java b/ruoyi-portal/src/main/java/com/ruoyi/portal/search/service/impl/PortalSearchEsServiceImpl.java index 1377593..7e9529d 100644 --- a/ruoyi-portal/src/main/java/com/ruoyi/portal/search/service/impl/PortalSearchEsServiceImpl.java +++ b/ruoyi-portal/src/main/java/com/ruoyi/portal/search/service/impl/PortalSearchEsServiceImpl.java @@ -9,8 +9,10 @@ import com.ruoyi.portal.search.convert.PortalSearchDocConverter; import com.ruoyi.portal.search.es.entity.PortalSearchDoc; import com.ruoyi.portal.search.es.mapper.PortalSearchMapper; import com.ruoyi.portal.search.service.PortalSearchEsService; +import com.ruoyi.portal.service.IHwSearchRebuildService; import org.dromara.easyes.core.biz.EsPageInfo; import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -32,15 +34,21 @@ public class PortalSearchEsServiceImpl implements PortalSearchEsService { private static final Logger log = LoggerFactory.getLogger(PortalSearchEsServiceImpl.class); + private static final String INDEX_NAME = "hw_portal_content"; + private static final Pattern ESCAPE_PATTERN = Pattern.compile("([\\\\.*+\\[\\](){}^$?|])"); private final PortalSearchMapper portalSearchMapper; + private final IHwSearchRebuildService hwSearchRebuildService; + private final ObjectMapper objectMapper = new ObjectMapper(); - public PortalSearchEsServiceImpl(PortalSearchMapper portalSearchMapper) + public PortalSearchEsServiceImpl(PortalSearchMapper portalSearchMapper, + @Autowired(required = false) IHwSearchRebuildService hwSearchRebuildService) { this.portalSearchMapper = portalSearchMapper; + this.hwSearchRebuildService = hwSearchRebuildService; } @Override @@ -50,7 +58,21 @@ public class PortalSearchEsServiceImpl implements PortalSearchEsService wrapper.and(q -> q.match(PortalSearchDoc::getTitle, keyword, 5.0f).or().match(PortalSearchDoc::getContent, keyword, 2.0f)); wrapper.eq(PortalSearchDoc::getIsDelete, "0"); - EsPageInfo pageInfo = portalSearchMapper.pageQuery(wrapper, pageNum, pageSize); + EsPageInfo pageInfo; + try + { + pageInfo = portalSearchMapper.pageQuery(wrapper, pageNum, pageSize); + } + catch (Exception e) + { + if (!isIndexNotFoundException(e)) + { + throw e; + } + // 首次切到 ES 或索引被误删时,自动重建索引并重试一次,避免接口只能依赖人工预热 + rebuildIndexAndRetry(); + pageInfo = portalSearchMapper.pageQuery(wrapper, pageNum, pageSize); + } List rows = pageInfo.getList().stream().map(doc -> toResult(doc, keyword, editMode)).collect(Collectors.toList()); SearchPageDTO page = new SearchPageDTO(); @@ -59,6 +81,32 @@ public class PortalSearchEsServiceImpl implements PortalSearchEsService return page; } + private void rebuildIndexAndRetry() + { + if (hwSearchRebuildService == null) + { + throw new IllegalStateException("门户搜索索引不存在,且未注入索引重建服务"); + } + log.warn("portal search index {} not found, rebuild automatically", INDEX_NAME); + hwSearchRebuildService.rebuildAll(); + } + + private boolean isIndexNotFoundException(Throwable throwable) + { + Throwable current = throwable; + while (current != null) + { + String message = current.getMessage(); + if (StringUtils.containsIgnoreCase(message, "index_not_found_exception") + || StringUtils.containsIgnoreCase(message, "no such index [" + INDEX_NAME + "]")) + { + return true; + } + current = current.getCause(); + } + return false; + } + private SearchResultDTO toResult(PortalSearchDoc doc, String keyword, boolean editMode) { SearchResultDTO result = new SearchResultDTO();