修改esbug
parent
6d7e98a31e
commit
770d7cc049
|
@ -2,12 +2,13 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<parent>
|
|
||||||
<artifactId>base-es</artifactId>
|
|
||||||
<groupId>com.bawei</groupId>
|
|
||||||
<version>3.6.0</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.bawei</groupId>
|
||||||
|
<artifactId>bawei-base</artifactId>
|
||||||
|
<version>3.6.0</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
<artifactId>base-es-common</artifactId>
|
<artifactId>base-es-common</artifactId>
|
||||||
|
|
||||||
|
@ -16,7 +17,6 @@
|
||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<!-- 项目公共核心依赖 -->
|
<!-- 项目公共核心依赖 -->
|
||||||
|
@ -25,4 +25,5 @@
|
||||||
<artifactId>bawei-common-core</artifactId>
|
<artifactId>bawei-common-core</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.bawei.common.domain;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class ConmtMap {
|
||||||
|
|
||||||
|
private long total;
|
||||||
|
|
||||||
|
private Map<String,Object> objectMap;
|
||||||
|
}
|
|
@ -1,27 +0,0 @@
|
||||||
package com.bawei.es.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bawei.es.domain
|
|
||||||
* @ClassName: CommonMap
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/23 14:29
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
public class CommonMap {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 个数
|
|
||||||
*/
|
|
||||||
private long total;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询数据
|
|
||||||
*/
|
|
||||||
private Map<String,Object> objectMap;
|
|
||||||
}
|
|
|
@ -2,12 +2,13 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<parent>
|
|
||||||
<artifactId>base-es</artifactId>
|
|
||||||
<groupId>com.bawei</groupId>
|
|
||||||
<version>3.6.0</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.bawei</groupId>
|
||||||
|
<artifactId>bawei-base</artifactId>
|
||||||
|
<version>3.6.0</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
<artifactId>base-es-remote</artifactId>
|
<artifactId>base-es-remote</artifactId>
|
||||||
|
|
||||||
|
@ -16,13 +17,11 @@
|
||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<!-- 文件服务公共依赖 -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.bawei</groupId>
|
<groupId>com.bawei</groupId>
|
||||||
<artifactId>base-es-common</artifactId>
|
<artifactId>base-es-common</artifactId>
|
||||||
|
<version>3.6.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.bawei.es.remote;
|
||||||
|
|
||||||
|
import com.bawei.common.core.constant.ServiceNameConstants;
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
import com.bawei.es.remote.factory.EsDocRemoteFactory;
|
||||||
|
import com.bawei.es.remote.factory.EsIndexRemoteFactory;
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
@FeignClient(contextId = "EsDocRemoteService", value = ServiceNameConstants.BAWEI_BASE_ES,
|
||||||
|
fallbackFactory = EsDocRemoteFactory.class,
|
||||||
|
path = "/doc")
|
||||||
|
public interface EsDocRemoteService {
|
||||||
|
@GetMapping("/queryList/{indexName}")
|
||||||
|
public R queryList(@PathVariable("indexName") String indexName, @RequestParam Map<String,Object> docMsg);
|
||||||
|
@PutMapping("/batchAddDoc/{indexName}")
|
||||||
|
public R batchAddDoc(@PathVariable("indexName") String indexName, @RequestBody Map<String,Object> docMsg);
|
||||||
|
@DeleteMapping("/bathDeleteDoc/{indexName}")
|
||||||
|
public R bathDeleteDoc(@PathVariable("indexName") String indexName, @RequestBody List<String> ids);
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.bawei.es.remote;
|
||||||
|
|
||||||
|
import com.bawei.common.core.constant.ServiceNameConstants;
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.es.remote.factory.EsIndexRemoteFactory;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
@FeignClient(contextId = "EsIndexRemoteService",value = ServiceNameConstants.BAWEI_BASE_ES,fallbackFactory = EsIndexRemoteFactory.class,path = "/index")
|
||||||
|
public interface EsIndexRemoteService {
|
||||||
|
@PostMapping("/createIndex/{indexName}")
|
||||||
|
public R createIndex(@PathVariable("indexName") String indexName, @RequestBody Map<String,Object> docMsg);
|
||||||
|
@PostMapping("/deleteIndex/{indexName}")
|
||||||
|
public R deleteIndex(@PathVariable("indexName") String indexName);
|
||||||
|
@PutMapping("/updateIndex/{indexName}")
|
||||||
|
public R updateIndex(@PathVariable("indexName") String indexName,@RequestBody Map<String,Object> docMsg);
|
||||||
|
@GetMapping("/findIndex/{indexName}")
|
||||||
|
public R findIndex(@PathVariable("indexName") String indexName);
|
||||||
|
@PostMapping("/getMapping/{indexName}")
|
||||||
|
public R getMapping(@PathVariable("indexName") String indexName);
|
||||||
|
}
|
|
@ -1,28 +0,0 @@
|
||||||
package com.bawei.es.remote.api;
|
|
||||||
|
|
||||||
import com.bawei.common.core.constant.ServiceNameConstants;
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.es.remote.factory.RemoteDocumentFallbackFactory;
|
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 文件服务
|
|
||||||
*
|
|
||||||
* @author bawei
|
|
||||||
*/
|
|
||||||
@FeignClient(contextId = "remoteDocumentService", value = ServiceNameConstants.ES_SERVICE, fallbackFactory = RemoteDocumentFallbackFactory.class)
|
|
||||||
public interface RemoteDocumentService
|
|
||||||
{
|
|
||||||
@PostMapping("/doc/{indexName}")
|
|
||||||
R queryList(@PathVariable(value = "indexName") String indexName, @RequestBody Map<String,Object> conditions);
|
|
||||||
|
|
||||||
@PutMapping("/doc/{indexName}")
|
|
||||||
R batchDocument(@PathVariable(value = "indexName") String indexName, @RequestBody List<String> dataJson);
|
|
||||||
|
|
||||||
@DeleteMapping("/doc/{indexName}")
|
|
||||||
R batchDeleteDocument(@PathVariable(value = "indexName") String indexName, @RequestBody List<String> dataJson);
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package com.bawei.es.remote.api;
|
|
||||||
|
|
||||||
import com.bawei.common.core.constant.ServiceNameConstants;
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.es.remote.factory.RemoteIndexFallbackFactory;
|
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 文件服务
|
|
||||||
*
|
|
||||||
* @author bawei
|
|
||||||
*/
|
|
||||||
@FeignClient(contextId = "remoteIndexService", value = ServiceNameConstants.ES_SERVICE, fallbackFactory = RemoteIndexFallbackFactory.class)
|
|
||||||
public interface RemoteIndexService
|
|
||||||
{
|
|
||||||
@GetMapping("/index/{indexName}")
|
|
||||||
public R exist(@PathVariable(value = "indexName") String indexName);
|
|
||||||
|
|
||||||
@GetMapping("/index/getMapping/{indexName}")
|
|
||||||
public R getMapping(@PathVariable(value = "indexName") String indexName);
|
|
||||||
|
|
||||||
@PostMapping("/index/{indexName}")
|
|
||||||
public R index(@PathVariable(value = "indexName") String indexName,@RequestBody Map<String,Object> mappings);
|
|
||||||
|
|
||||||
@PutMapping("/index/{indexName}")
|
|
||||||
public R updateIndex(@PathVariable(value = "indexName") String indexName,@RequestBody Map<String,Object> mappings);
|
|
||||||
|
|
||||||
@DeleteMapping("/index/{indexName}")
|
|
||||||
public R deleteIndex(@PathVariable(value = "indexName") String indexName);
|
|
||||||
}
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.bawei.es.remote.factory;
|
||||||
|
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
import com.bawei.es.remote.EsDocRemoteService;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Log4j2
|
||||||
|
public class EsDocRemoteFactory implements FallbackFactory<EsDocRemoteService> {
|
||||||
|
@Override
|
||||||
|
public EsDocRemoteService create(Throwable cause) {
|
||||||
|
return new EsDocRemoteService() {
|
||||||
|
@Override
|
||||||
|
public R queryList(String indexName, Map<String, Object> docMsg) {
|
||||||
|
log.error("调用查询信息远程服务失败{}-{}-{}-{}",indexName,docMsg,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R batchAddDoc(String indexName, Map<String, Object> docMsg) {
|
||||||
|
log.error("调用批量添加信息远程服务失败{}-{}-{}",indexName,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R bathDeleteDoc(String indexName, List<String> ids) {
|
||||||
|
log.error("调用批量删除信息远程服务失败{}-{}-{}-{}",indexName,ids,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.bawei.es.remote.factory;
|
||||||
|
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.es.remote.EsIndexRemoteService;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Log4j2
|
||||||
|
public class EsIndexRemoteFactory implements FallbackFactory<EsIndexRemoteService> {
|
||||||
|
@Override
|
||||||
|
public EsIndexRemoteService create(Throwable cause) {
|
||||||
|
return new EsIndexRemoteService() {
|
||||||
|
@Override
|
||||||
|
public R createIndex(String indexName, Map<String, Object> docMsg) {
|
||||||
|
log.error("远程调用创建索引服务失败:{}-{}-{}-{}",indexName,docMsg,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R findIndex(String indexName) {
|
||||||
|
log.error("远程调用查询索引服务失败:{}-{}-{}",indexName,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R getMapping(String indexName) {
|
||||||
|
log.error("远程调用获取Mapping服务失败:{}-{}-{}",indexName,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R deleteIndex(String indexName) {
|
||||||
|
log.error("远程调用删除索引服务失败:{}-{}-{}",indexName,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R updateIndex(String indexName, Map<String, Object> docMsg) {
|
||||||
|
log.error("远程调用修改索引服务失败:{}-{}-{}{}",indexName,docMsg,cause.getMessage(),cause);
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,43 +0,0 @@
|
||||||
package com.bawei.es.remote.factory;
|
|
||||||
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.es.remote.api.RemoteDocumentService;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.cloud.openfeign.FallbackFactory;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 文件服务降级处理
|
|
||||||
*
|
|
||||||
* @author bawei
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class RemoteDocumentFallbackFactory implements FallbackFactory<RemoteDocumentService>
|
|
||||||
{
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(RemoteDocumentFallbackFactory.class);
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RemoteDocumentService create(Throwable cause) {
|
|
||||||
return new RemoteDocumentService() {
|
|
||||||
@Override
|
|
||||||
public R queryList(String indexName, Map<String, Object> conditions) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R batchDocument(String indexName, List<String> dataJson) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R batchDeleteDocument(String indexName, List<String> dataJson) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
package com.bawei.es.remote.factory;
|
|
||||||
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.es.remote.api.RemoteIndexService;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.cloud.openfeign.FallbackFactory;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 文件服务降级处理
|
|
||||||
*
|
|
||||||
* @author bawei
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class RemoteIndexFallbackFactory implements FallbackFactory<RemoteIndexService>
|
|
||||||
{
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(RemoteIndexFallbackFactory.class);
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RemoteIndexService create(Throwable cause) {
|
|
||||||
return new RemoteIndexService() {
|
|
||||||
@Override
|
|
||||||
public R exist(String indexName) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R getMapping(String indexName) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R index(String indexName, Map<String, Object> mappings) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R updateIndex(String indexName, Map<String, Object> mappings) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R deleteIndex(String indexName) {
|
|
||||||
return R.fail();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,2 +1,2 @@
|
||||||
com.bawei.es.remote.factory.RemoteIndexFallbackFactory
|
com.bawei.es.remote.factory.EsIndexRemoteFactory
|
||||||
com.bawei.es.remote.factory.RemoteDocumentFallbackFactory
|
com.bawei.es.remote.factory.EsDocRemoteFactory
|
||||||
|
|
|
@ -2,12 +2,13 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<parent>
|
|
||||||
<artifactId>base-es</artifactId>
|
|
||||||
<groupId>com.bawei</groupId>
|
|
||||||
<version>3.6.0</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.bawei</groupId>
|
||||||
|
<artifactId>bawei-base</artifactId>
|
||||||
|
<version>3.6.0</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
<artifactId>base-es-server</artifactId>
|
<artifactId>base-es-server</artifactId>
|
||||||
|
|
||||||
|
@ -16,9 +17,12 @@
|
||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.xiaoymin</groupId>
|
||||||
|
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
|
||||||
|
<version>4.1.0</version>
|
||||||
|
</dependency>
|
||||||
<!-- SpringCloud Alibaba Nacos -->
|
<!-- SpringCloud Alibaba Nacos -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.cloud</groupId>
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
|
@ -51,7 +55,23 @@
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.bawei</groupId>
|
<groupId>com.bawei</groupId>
|
||||||
<artifactId>bawei-common-security</artifactId>
|
<artifactId>bawei-common-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate.validator</groupId>
|
||||||
|
<artifactId>hibernate-validator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.elasticsearch.plugin</groupId>
|
||||||
|
<artifactId>transport-netty4-client</artifactId>
|
||||||
|
<version>6.7.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -59,7 +79,7 @@
|
||||||
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- BaWei Common DataScope -->
|
<!-- es-common -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.bawei</groupId>
|
<groupId>com.bawei</groupId>
|
||||||
<artifactId>base-es-common</artifactId>
|
<artifactId>base-es-common</artifactId>
|
||||||
|
|
|
@ -7,11 +7,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
|
|
||||||
@EnableCustomSwagger2
|
@EnableCustomSwagger2
|
||||||
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
|
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
|
||||||
public class BaWeiEsApplication {
|
public class EsApplication {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(BaWeiEsApplication.class, args);
|
SpringApplication.run(EsApplication.class, args);
|
||||||
System.out.println("(♥◠‿◠)ノ゙ es服务模块启动成功 ლ(´ڡ`ლ)゙ ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.bawei.es.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.apache.http.HttpHost;
|
||||||
|
import org.elasticsearch.client.RestClient;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "es")
|
||||||
|
@Data
|
||||||
|
public class Config {
|
||||||
|
@Value("${es.host}")
|
||||||
|
private String host;
|
||||||
|
@Value("${es.port}")
|
||||||
|
private int port;
|
||||||
|
@Value("${es.scheme}")
|
||||||
|
private String scheme;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public RestHighLevelClient restHighLevelClient(){
|
||||||
|
return new RestHighLevelClient(
|
||||||
|
RestClient.builder(new HttpHost(host,port,scheme))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,59 +0,0 @@
|
||||||
package com.bawei.es.config;
|
|
||||||
|
|
||||||
import org.apache.http.HttpHost;
|
|
||||||
import org.elasticsearch.client.RestClient;
|
|
||||||
import org.elasticsearch.client.RestHighLevelClient;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.config
|
|
||||||
* @ClassName: ElasticSearchConfig
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/22 20:50
|
|
||||||
*/
|
|
||||||
@Configuration
|
|
||||||
public class ElasticSearchConfig {
|
|
||||||
|
|
||||||
@Value("${es.host}")
|
|
||||||
private String host;
|
|
||||||
|
|
||||||
@Value("${es.port}")
|
|
||||||
private int port;
|
|
||||||
|
|
||||||
@Value("${es.scheme}")
|
|
||||||
private String scheme;
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public RestHighLevelClient restHighLevelClient(){
|
|
||||||
return new RestHighLevelClient(
|
|
||||||
RestClient.builder(new HttpHost(host, port, scheme)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHost() {
|
|
||||||
return host;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHost(String host) {
|
|
||||||
this.host = host;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getPort() {
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPort(int port) {
|
|
||||||
this.port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getScheme() {
|
|
||||||
return scheme;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setScheme(String scheme) {
|
|
||||||
this.scheme = scheme;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
package com.bawei.es.controller;
|
|
||||||
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.es.service.DocumentService;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.controller
|
|
||||||
* @ClassName: DocumentController
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/22 20:57
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/doc")
|
|
||||||
@Api(tags = "es文档接口")
|
|
||||||
public class DocumentController {
|
|
||||||
|
|
||||||
@Resource(name = "documentServiceImpl")
|
|
||||||
private DocumentService documentService;
|
|
||||||
|
|
||||||
@PostMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "条件查询文档数据")
|
|
||||||
public R queryList(@PathVariable String indexName, @RequestBody Map<String,Object> conditions){
|
|
||||||
return documentService.queryList(indexName,conditions);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "批量操作数据")
|
|
||||||
public R batchDocument(@PathVariable String indexName, @RequestBody Map<String,Object> dataJson){
|
|
||||||
documentService.batchOperation(indexName,dataJson);
|
|
||||||
return R.ok(null, "批量操作成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "批量删除")
|
|
||||||
public R batchDeleteDocument(@PathVariable String indexName, @RequestBody List<String> dataJson){
|
|
||||||
documentService.batchDeletion(indexName,dataJson);
|
|
||||||
return R.ok(null, "批量删除成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.bawei.es.controller;
|
||||||
|
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
import com.bawei.es.service.EsDocService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/doc")
|
||||||
|
public class EsDocController {
|
||||||
|
@Autowired
|
||||||
|
private EsDocService esDocService;
|
||||||
|
|
||||||
|
@GetMapping("/queryList/{indexName}")
|
||||||
|
public R queryList(@PathVariable String indexName, @RequestParam Map<String,Object> docMsg){
|
||||||
|
return R.ok(esDocService.queryList(indexName,docMsg),"数据查询成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/batchAddDoc/{indexName}")
|
||||||
|
public R batchAddDoc(@PathVariable String indexName, @RequestBody Map<String,Object> docMsg){
|
||||||
|
esDocService.batchAddDoc(indexName,docMsg);
|
||||||
|
return R.ok(null,"批量操作文档数据成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/bathDeleteDoc/{indexName}")
|
||||||
|
public R bathDeleteDoc(@PathVariable String indexName, @RequestBody List<String> ids){
|
||||||
|
esDocService.bathDeleteDoc(indexName,ids);
|
||||||
|
return R.ok(null,"批量删除文档数据成功");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.bawei.es.controller;
|
||||||
|
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
import com.bawei.es.service.EsIndexService;
|
||||||
|
import org.apache.ibatis.annotations.Update;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/index")
|
||||||
|
public class EsIndexController {
|
||||||
|
@Autowired
|
||||||
|
private EsIndexService esindexService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/createIndex/{indexName}")
|
||||||
|
public R createIndex(@PathVariable String indexName, @RequestBody Map<String,Object> docMsg) {
|
||||||
|
return R.ok(esindexService.createIndex(indexName,docMsg),"索引添加成功");
|
||||||
|
}
|
||||||
|
@PostMapping("/deleteIndex")
|
||||||
|
public R deleteIndex(String indexName) {
|
||||||
|
return R.ok(esindexService.deleteIndex(indexName),"es索引删除成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/updateIndex")
|
||||||
|
public R updateIndex(@PathVariable String indexName,@RequestBody Map<String,Object> docMsg){
|
||||||
|
return R.ok(esindexService.updateIndex(indexName,docMsg),"es索引修改成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/findIndex/{indexName}")
|
||||||
|
public R findIndex(@PathVariable String indexName) {
|
||||||
|
return esindexService.findIndex(indexName) ? R.ok("es索引存在") : R.fail(500,"es索引不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/getMapping/{indexName}")
|
||||||
|
public R getMapping(@PathVariable String indexName) {
|
||||||
|
return R.ok(esindexService.getMapping(indexName),"索引映射存在");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,58 +0,0 @@
|
||||||
package com.bawei.es.controller;
|
|
||||||
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.es.service.IndexService;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.controller
|
|
||||||
* @ClassName: IndexController
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/22 20:45
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/index")
|
|
||||||
@Api(tags = "es索引接口")
|
|
||||||
public class IndexController {
|
|
||||||
|
|
||||||
@Resource(name = "indexServiceImpl")
|
|
||||||
private IndexService indexService;
|
|
||||||
|
|
||||||
@GetMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "查询es索引是否存在")
|
|
||||||
public R exist(@PathVariable String indexName){
|
|
||||||
return R.ok(indexService.exist(indexName),"es索引存在");
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/getMapping/{indexName}")
|
|
||||||
@ApiOperation(value = "获取索引映射")
|
|
||||||
public R getMapping(@PathVariable String indexName){
|
|
||||||
return R.ok(indexService.getMapping(indexName),"索引映射存在");
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "添加索引")
|
|
||||||
public R index(@PathVariable String indexName,@RequestBody Map<String,Object> mappings){
|
|
||||||
return R.ok(indexService.index(indexName,mappings),"es索引添加成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "修改索引")
|
|
||||||
public R updateIndex(@PathVariable String indexName,@RequestBody Map<String,Object> mappings){
|
|
||||||
return R.ok(indexService.updataIndex(indexName,mappings),"es索引修改成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping("/{indexName}")
|
|
||||||
@ApiOperation(value = "删除索引")
|
|
||||||
public R deleteIndex(@PathVariable String indexName){
|
|
||||||
return R.ok(indexService.deleteIndex(indexName),"es索引删除成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
package com.bawei.es.handler;
|
||||||
|
|
||||||
|
import com.bawei.common.core.constant.HttpStatus;
|
||||||
|
import com.bawei.common.core.exception.DemoModeException;
|
||||||
|
import com.bawei.common.core.exception.InnerAuthException;
|
||||||
|
import com.bawei.common.core.exception.ServiceException;
|
||||||
|
import com.bawei.common.core.exception.auth.NotPermissionException;
|
||||||
|
import com.bawei.common.core.exception.auth.NotRoleException;
|
||||||
|
import com.bawei.common.core.utils.StringUtils;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.validation.BindException;
|
||||||
|
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
||||||
|
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局异常处理器
|
||||||
|
*
|
||||||
|
* @author bawei
|
||||||
|
*/
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class GlobalExceptionHandler
|
||||||
|
{
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 权限码异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(NotPermissionException.class)
|
||||||
|
public AjaxResult handleNotPermissionException(NotPermissionException e, HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage(), e);
|
||||||
|
return AjaxResult.error(HttpStatus.FORBIDDEN, "没有访问权限,请联系管理员授权");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色权限异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(NotRoleException.class)
|
||||||
|
public AjaxResult handleNotRoleException(NotRoleException e, HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage());
|
||||||
|
return AjaxResult.error(HttpStatus.FORBIDDEN, "没有访问权限,请联系管理员授权");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求方式不支持
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
|
||||||
|
public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
|
||||||
|
HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
|
||||||
|
return AjaxResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(ServiceException.class)
|
||||||
|
public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
|
||||||
|
{
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
Integer code = e.getCode();
|
||||||
|
return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拦截未知的运行时异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(RuntimeException.class)
|
||||||
|
public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求地址'{}',发生未知异常.", requestURI, e);
|
||||||
|
return AjaxResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
public AjaxResult handleException(Exception e, HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求地址'{}',发生系统异常.", requestURI, e);
|
||||||
|
return AjaxResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义验证异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(BindException.class)
|
||||||
|
public AjaxResult handleBindException(BindException e)
|
||||||
|
{
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
String message = e.getAllErrors().get(0).getDefaultMessage();
|
||||||
|
return AjaxResult.error(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义验证异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||||
|
public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
|
||||||
|
{
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
String message = e.getBindingResult().getFieldError().getDefaultMessage();
|
||||||
|
return AjaxResult.error(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内部认证异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(InnerAuthException.class)
|
||||||
|
public AjaxResult handleInnerAuthException(InnerAuthException e)
|
||||||
|
{
|
||||||
|
return AjaxResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 演示模式异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(DemoModeException.class)
|
||||||
|
public AjaxResult handleDemoModeException(DemoModeException e)
|
||||||
|
{
|
||||||
|
return AjaxResult.error("演示模式,不允许操作");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,22 +0,0 @@
|
||||||
package com.bawei.es.service;
|
|
||||||
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.service
|
|
||||||
* @ClassName: DocumentService
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/22 20:58
|
|
||||||
*/
|
|
||||||
public interface DocumentService {
|
|
||||||
R queryList(String indexName, Map<String, Object> conditions);
|
|
||||||
|
|
||||||
void batchOperation(String indexName, Map<String,Object> dataJson);
|
|
||||||
|
|
||||||
void batchDeletion(String indexName, List<String> dataJson);
|
|
||||||
}
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.bawei.es.service;
|
||||||
|
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface EsDocService {
|
||||||
|
void batchAddDoc(String indexName, Map<String, Object> docMsg);
|
||||||
|
|
||||||
|
void bathDeleteDoc(String indexName, List<String> ids);
|
||||||
|
|
||||||
|
R queryList(String indexName, Map<String, Object> docMsg);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.bawei.es.service;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface EsIndexService {
|
||||||
|
boolean findIndex(String indexName);
|
||||||
|
|
||||||
|
boolean createIndex(String indexName,Map<String,Object> docMsg);
|
||||||
|
|
||||||
|
boolean deleteIndex(String indexName);
|
||||||
|
|
||||||
|
Map<String, Object> getMapping(String indexName);
|
||||||
|
|
||||||
|
boolean updateIndex(String indexName, Map<String, Object> docMsg);
|
||||||
|
}
|
|
@ -1,23 +0,0 @@
|
||||||
package com.bawei.es.service;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.service
|
|
||||||
* @ClassName: EsService
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/22 20:56
|
|
||||||
*/
|
|
||||||
public interface IndexService {
|
|
||||||
boolean exist(String indexName);
|
|
||||||
|
|
||||||
boolean index(String indexName, Map<String, Object> mappings);
|
|
||||||
|
|
||||||
boolean updataIndex(String indexName, Map<String, Object> mappings);
|
|
||||||
|
|
||||||
boolean deleteIndex(String indexName);
|
|
||||||
|
|
||||||
Map<String, Object> getMapping(String indexName);
|
|
||||||
}
|
|
|
@ -1,320 +0,0 @@
|
||||||
package com.bawei.es.service.impl;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
|
||||||
import com.bawei.common.core.domain.R;
|
|
||||||
import com.bawei.common.core.exception.ServiceException;
|
|
||||||
import com.bawei.common.core.utils.StringUtils;
|
|
||||||
import com.bawei.es.domain.CommonMap;
|
|
||||||
import com.bawei.es.service.DocumentService;
|
|
||||||
import org.elasticsearch.action.bulk.BulkRequest;
|
|
||||||
import org.elasticsearch.action.bulk.BulkResponse;
|
|
||||||
import org.elasticsearch.action.delete.DeleteRequest;
|
|
||||||
import org.elasticsearch.action.index.IndexRequest;
|
|
||||||
import org.elasticsearch.action.search.SearchRequest;
|
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
|
||||||
import org.elasticsearch.client.RequestOptions;
|
|
||||||
import org.elasticsearch.client.RestHighLevelClient;
|
|
||||||
import org.elasticsearch.common.text.Text;
|
|
||||||
import org.elasticsearch.index.query.BoolQueryBuilder;
|
|
||||||
import org.elasticsearch.index.query.QueryBuilder;
|
|
||||||
import org.elasticsearch.index.query.QueryBuilders;
|
|
||||||
import org.elasticsearch.index.query.RangeQueryBuilder;
|
|
||||||
import org.elasticsearch.search.SearchHit;
|
|
||||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
||||||
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
|
||||||
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
|
|
||||||
import org.elasticsearch.search.sort.SortOrder;
|
|
||||||
import org.elasticsearch.xcontent.XContentType;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.util.CollectionUtils;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.service.impl
|
|
||||||
* @ClassName: DocumentServiceImpl
|
|
||||||
* @Description: Elasticsearch 文档服务实现类
|
|
||||||
* @Date: 2024/4/22 20:58
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public class DocumentServiceImpl implements DocumentService {
|
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(DocumentServiceImpl.class);
|
|
||||||
|
|
||||||
@Resource(name = "restHighLevelClient")
|
|
||||||
private RestHighLevelClient restHighLevelClient;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R queryList(String indexName, Map<String, Object> conditions) {
|
|
||||||
// 验证索引名
|
|
||||||
validateIndexName(indexName);
|
|
||||||
|
|
||||||
// 构建搜索请求
|
|
||||||
SearchRequest searchRequest = buildSearchRequest(indexName, conditions);
|
|
||||||
|
|
||||||
// 执行搜索
|
|
||||||
SearchResponse searchResponse;
|
|
||||||
try {
|
|
||||||
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error("Failed to execute search request", e);
|
|
||||||
return R.fail("Query failed: " + e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析搜索结果
|
|
||||||
CommonMap result = processSearchResponse(searchResponse);
|
|
||||||
|
|
||||||
return R.ok(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SearchRequest buildSearchRequest(String indexName, Map<String, Object> conditions) {
|
|
||||||
SearchRequest searchRequest = new SearchRequest(indexName);
|
|
||||||
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
|
|
||||||
|
|
||||||
// 构造查询条件
|
|
||||||
QueryBuilder queryBuilder = buildQueryBuilder(conditions);
|
|
||||||
sourceBuilder.query(queryBuilder);
|
|
||||||
|
|
||||||
// 设置分页参数
|
|
||||||
setPaginationParameters(conditions, sourceBuilder);
|
|
||||||
|
|
||||||
// 设置排序参数
|
|
||||||
setSortParameters(conditions, sourceBuilder);
|
|
||||||
|
|
||||||
// 设置高亮参数
|
|
||||||
setHighlightParameters(conditions, sourceBuilder);
|
|
||||||
|
|
||||||
searchRequest.source(sourceBuilder);
|
|
||||||
|
|
||||||
// 记录搜索请求的详细信息(仅用于调试)
|
|
||||||
log.debug("ES search request DDL: {}", sourceBuilder.toString());
|
|
||||||
|
|
||||||
return searchRequest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void batchOperation(String indexName, Map<String, Object> dataJson) {
|
|
||||||
BulkRequest bulkRequest = new BulkRequest();
|
|
||||||
|
|
||||||
// 根据dataJson中的key,进行批量操作
|
|
||||||
for (Map.Entry<String, Object> entry : dataJson.entrySet()) {
|
|
||||||
String id = entry.getKey();
|
|
||||||
Map<String, Object> document = (Map<String, Object>) entry.getValue();
|
|
||||||
|
|
||||||
// 示例代码仅处理索引(index)和删除(delete)操作
|
|
||||||
IndexRequest indexRequest = new IndexRequest(indexName).id(id).source(document, XContentType.JSON);
|
|
||||||
bulkRequest.add(indexRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
|
|
||||||
|
|
||||||
// 检查批量操作结果,返回R对象
|
|
||||||
if (bulkResponse.hasFailures()) {
|
|
||||||
throw new ServiceException("Bulk operation failed: " + bulkResponse.buildFailureMessage());
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new ServiceException("批量操作失败: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void batchDeletion(String indexName, List<String> ids) {
|
|
||||||
// 参数校验
|
|
||||||
validateIndexName(indexName);
|
|
||||||
if (CollectionUtils.isEmpty(ids)) {
|
|
||||||
throw new IllegalArgumentException("请输入需要删除的文档ID集合");
|
|
||||||
}
|
|
||||||
|
|
||||||
BulkRequest bulkRequest = new BulkRequest();
|
|
||||||
// 构建批量删除请求
|
|
||||||
for (String id : ids) {
|
|
||||||
bulkRequest.add(new DeleteRequest(indexName, id));
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 执行批量删除操作
|
|
||||||
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
|
|
||||||
// 检查批量删除结果
|
|
||||||
if (bulkResponse.hasFailures()) {
|
|
||||||
throw new RuntimeException("批量删除失败: " + bulkResponse.buildFailureMessage());
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException("执行批量删除操作时发生错误: " + e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验索引名称是否为空
|
|
||||||
* @param indexName 索引名称
|
|
||||||
*/
|
|
||||||
private void validateIndexName(String indexName) {
|
|
||||||
if (StringUtils.isBlank(indexName)) {
|
|
||||||
throw new ServiceException("索引名为空,请重试!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setPaginationParameters(Map<String, Object> conditions, SearchSourceBuilder sourceBuilder) {
|
|
||||||
// 从条件中获取分页信息
|
|
||||||
Map<String, Object> pagination = (Map<String, Object>) conditions.get("pagination");
|
|
||||||
if (pagination == null) {
|
|
||||||
// 如果没有分页信息,则不设置分页参数
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 校验并获取分页参数
|
|
||||||
int page;
|
|
||||||
int limit;
|
|
||||||
try {
|
|
||||||
page = Integer.parseInt(pagination.getOrDefault("page", "1").toString());
|
|
||||||
limit = Integer.parseInt(pagination.getOrDefault("limit", "10").toString());
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// 如果分页参数不是整数,则抛出异常
|
|
||||||
throw new IllegalArgumentException("Invalid pagination parameters: page and limit must be integers", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置分页参数
|
|
||||||
int from = (page - 1) * limit;
|
|
||||||
sourceBuilder.from(from).size(limit);
|
|
||||||
|
|
||||||
// 记录日志(可选,根据实际需求决定是否记录)
|
|
||||||
log.debug("Pagination parameters set: page={}, limit={}, from={}", page, limit, from);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setSortParameters(Map<String, Object> conditions, SearchSourceBuilder sourceBuilder) {
|
|
||||||
Map sort = (Map) conditions.get("sort");
|
|
||||||
if (sort != null) {
|
|
||||||
Object sortOrderObject = sort.get("sortOrder");
|
|
||||||
Object fieldObject = sort.get("field");
|
|
||||||
|
|
||||||
if (sortOrderObject instanceof String && fieldObject instanceof String) {
|
|
||||||
String sortOrder = (String) sortOrderObject;
|
|
||||||
String field = (String) fieldObject;
|
|
||||||
|
|
||||||
if ("asc".equalsIgnoreCase(sortOrder) || "desc".equalsIgnoreCase(sortOrder)) {
|
|
||||||
SortOrder sortOrderEnum = "asc".equalsIgnoreCase(sortOrder) ? SortOrder.ASC : SortOrder.DESC;
|
|
||||||
log.info("Applying sort: field={}, sortOrder={}", field, sortOrder);
|
|
||||||
sourceBuilder.sort(field, sortOrderEnum);
|
|
||||||
} else {
|
|
||||||
SortOrder sortOrderEnum = SortOrder.ASC;
|
|
||||||
log.info("Applying sort: field={}, sortOrder={}", field, sortOrder);
|
|
||||||
sourceBuilder.sort(field, sortOrderEnum);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Invalid sort parameters. Both 'sortOrder' and 'field' must be strings.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void setHighlightParameters(Map<String, Object> conditions, SearchSourceBuilder sourceBuilder) {
|
|
||||||
Map<String, Object> highlightParams = (Map<String, Object>) conditions.get("highlight");
|
|
||||||
if (highlightParams != null) {
|
|
||||||
HighlightBuilder highlightBuilder = new HighlightBuilder();
|
|
||||||
List<String> fieldNames = (List<String>) highlightParams.getOrDefault("fields", Collections.emptyList());
|
|
||||||
String preTag = (String) highlightParams.getOrDefault("preTag", "<em>");
|
|
||||||
String postTag = (String) highlightParams.getOrDefault("postTag", "</em>");
|
|
||||||
|
|
||||||
for (String fieldName : fieldNames) {
|
|
||||||
highlightBuilder.field(fieldName);
|
|
||||||
}
|
|
||||||
|
|
||||||
highlightBuilder.preTags(preTag);
|
|
||||||
highlightBuilder.postTags(postTag);
|
|
||||||
|
|
||||||
sourceBuilder.highlighter(highlightBuilder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private CommonMap processSearchResponse(SearchResponse searchResponse) {
|
|
||||||
CommonMap result = new CommonMap();
|
|
||||||
long totalHits = searchResponse.getHits().getTotalHits().value;
|
|
||||||
result.setTotal(totalHits);
|
|
||||||
|
|
||||||
LinkedHashMap<String, Object> objectMap = new LinkedHashMap<>();
|
|
||||||
for (SearchHit hit : searchResponse.getHits().getHits()) {
|
|
||||||
String sourceAsString = hit.getSourceAsString();
|
|
||||||
HashMap<String, Object> parsedObject = JSONObject.parseObject(sourceAsString, HashMap.class);
|
|
||||||
String id = hit.getId();
|
|
||||||
// 添加高亮信息到解析后的文档
|
|
||||||
addHighlightedFields(hit.getHighlightFields(), parsedObject);
|
|
||||||
|
|
||||||
objectMap.put(id, parsedObject);
|
|
||||||
log.info("查询出来的数据为:{}",JSONObject.toJSONString(parsedObject));
|
|
||||||
}
|
|
||||||
log.info("查询出来的数据为:{}",JSONObject.toJSONString(objectMap));
|
|
||||||
result.setObjectMap(objectMap);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addHighlightedFields(Map<String, HighlightField> highlightFields, Map<String, Object> parsedObject) {
|
|
||||||
if (!highlightFields.isEmpty()) {
|
|
||||||
for (Map.Entry<String, HighlightField> entry : highlightFields.entrySet()) {
|
|
||||||
String fieldName = entry.getKey();
|
|
||||||
Text[] fragments = entry.getValue().fragments();
|
|
||||||
StringBuilder highlightedValue = new StringBuilder();
|
|
||||||
for (Text fragment : fragments) {
|
|
||||||
highlightedValue.append(fragment);
|
|
||||||
}
|
|
||||||
parsedObject.put(fieldName, highlightedValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据条件构建Elasticsearch查询构建器
|
|
||||||
*
|
|
||||||
* @param conditions 查询条件(键值对形式)
|
|
||||||
* @return Elasticsearch查询构建器
|
|
||||||
*/
|
|
||||||
private QueryBuilder buildQueryBuilder(Map<String, Object> conditions) {
|
|
||||||
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
|
|
||||||
|
|
||||||
if (conditions != null && !conditions.isEmpty()) {
|
|
||||||
for (Map.Entry<String, Object> entry : conditions.entrySet()) {
|
|
||||||
String field = entry.getKey();
|
|
||||||
Object value = entry.getValue();
|
|
||||||
|
|
||||||
// 处理范围查询条件
|
|
||||||
if (value instanceof Map && ((Map<?, ?>) value).containsKey("range")) {
|
|
||||||
Map<String, Object> rangeParams = (Map<String, Object>) value;
|
|
||||||
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(field);
|
|
||||||
|
|
||||||
String gt = (String) rangeParams.get("gt");
|
|
||||||
if (gt != null) {
|
|
||||||
rangeQueryBuilder.gt(gt);
|
|
||||||
}
|
|
||||||
|
|
||||||
String gte = (String) rangeParams.get("gte");
|
|
||||||
if (gte != null) {
|
|
||||||
rangeQueryBuilder.gte(gte);
|
|
||||||
}
|
|
||||||
|
|
||||||
String lt = (String) rangeParams.get("lt");
|
|
||||||
if (lt != null) {
|
|
||||||
rangeQueryBuilder.lt(lt);
|
|
||||||
}
|
|
||||||
|
|
||||||
String lte = (String) rangeParams.get("lte");
|
|
||||||
if (lte != null) {
|
|
||||||
rangeQueryBuilder.lte(lte);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolQueryBuilder.filter(rangeQueryBuilder);
|
|
||||||
}
|
|
||||||
// 处理其他查询条件(如 match 查询)
|
|
||||||
else if (value instanceof String) {
|
|
||||||
boolQueryBuilder.filter(QueryBuilders.matchQuery(field, value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return boolQueryBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,287 @@
|
||||||
|
package com.bawei.es.service.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
|
import com.bawei.common.core.exception.ServiceException;
|
||||||
|
import com.bawei.common.core.utils.StringUtils;
|
||||||
|
import com.bawei.common.core.web.domain.AjaxResult;
|
||||||
|
import com.bawei.common.domain.ConmtMap;
|
||||||
|
import com.bawei.es.service.EsDocService;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.elasticsearch.action.bulk.BulkRequest;
|
||||||
|
import org.elasticsearch.action.bulk.BulkResponse;
|
||||||
|
import org.elasticsearch.action.delete.DeleteRequest;
|
||||||
|
import org.elasticsearch.action.index.IndexRequest;
|
||||||
|
import org.elasticsearch.action.search.SearchRequest;
|
||||||
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
|
import org.elasticsearch.client.RequestOptions;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.elasticsearch.common.text.Text;
|
||||||
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
||||||
|
import org.elasticsearch.index.query.QueryBuilder;
|
||||||
|
import org.elasticsearch.index.query.QueryBuilders;
|
||||||
|
import org.elasticsearch.index.query.RangeQueryBuilder;
|
||||||
|
import org.elasticsearch.search.SearchHit;
|
||||||
|
import org.elasticsearch.search.SearchHits;
|
||||||
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
|
||||||
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
|
||||||
|
import org.elasticsearch.xcontent.XContentType;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.elasticsearch.search.sort.SortOrder;
|
||||||
|
|
||||||
|
import javax.swing.text.Highlighter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Log4j2
|
||||||
|
public class EsDocServiceImpl implements EsDocService {
|
||||||
|
@Autowired
|
||||||
|
private RestHighLevelClient restHighLevelClient;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void batchAddDoc(String indexName, Map<String, Object> docMsg) {
|
||||||
|
BulkRequest bulkRequest = new BulkRequest();
|
||||||
|
for (Map.Entry<String, Object> entry : docMsg.entrySet()){
|
||||||
|
String id = entry.getKey();
|
||||||
|
Map<String, Object> value = (Map<String, Object>) entry.getValue();
|
||||||
|
IndexRequest source = new IndexRequest(indexName).id(id).source(value, XContentType.JSON);
|
||||||
|
bulkRequest.add(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
|
||||||
|
if(bulk.hasFailures()){
|
||||||
|
throw new RuntimeException("Bulk operation failed: "+ bulk.buildFailureMessage());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ServiceException("批量操作失败: "+e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bathDeleteDoc(String indexName, List<String> ids) {
|
||||||
|
BulkRequest bulkRequest = new BulkRequest();
|
||||||
|
|
||||||
|
for (String id : ids){
|
||||||
|
DeleteRequest deleteRequest = new DeleteRequest(indexName, String.valueOf(id));
|
||||||
|
bulkRequest.add(deleteRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
|
||||||
|
if(bulk.hasFailures()){
|
||||||
|
throw new RuntimeException("批量删除失败: "+ bulk.buildFailureMessage());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("批量删除失败:"+ e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R queryList(String indexName, Map<String, Object> docMsg) {
|
||||||
|
// 验证索引名称
|
||||||
|
checkedIndexName(indexName);
|
||||||
|
// 构造搜索请求
|
||||||
|
SearchRequest searchRequest = builderRequest(indexName,docMsg);
|
||||||
|
// 执行搜索
|
||||||
|
SearchResponse searchResponse;
|
||||||
|
try {
|
||||||
|
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("ES 搜索 异常: {}",e.getMessage());
|
||||||
|
return R.fail("ES 搜索 异常: "+e.getMessage());
|
||||||
|
}
|
||||||
|
// 处理搜索结果
|
||||||
|
ConmtMap response = processSearchResponse(searchResponse);
|
||||||
|
|
||||||
|
return R.ok(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConmtMap processSearchResponse(SearchResponse searchResponse) {
|
||||||
|
ConmtMap conmtMap = new ConmtMap();
|
||||||
|
long total = searchResponse.getHits().getTotalHits().value;
|
||||||
|
conmtMap.setTotal(total);
|
||||||
|
|
||||||
|
LinkedHashMap<String, Object> stringObjectLinkedHashMap = new LinkedHashMap<>();
|
||||||
|
for (SearchHit hit : searchResponse.getHits().getHits()) {
|
||||||
|
String sourceAsString = hit.getSourceAsString();
|
||||||
|
HashMap<String,Object> map = JSONObject.parseObject(sourceAsString, HashMap.class);
|
||||||
|
String id = hit.getId();
|
||||||
|
// 添加高亮信息到最后解析的文档
|
||||||
|
addHighlightedFields(hit.getHighlightFields(),map);
|
||||||
|
|
||||||
|
stringObjectLinkedHashMap.put(id,map);
|
||||||
|
log.info("查询出来的数据是: {}",JSONObject.toJSONString(map));
|
||||||
|
}
|
||||||
|
log.info("查询出来的数据是: {}",JSONObject.toJSONString(stringObjectLinkedHashMap));
|
||||||
|
conmtMap.setObjectMap(stringObjectLinkedHashMap);
|
||||||
|
return conmtMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addHighlightedFields(Map<String, HighlightField> highlightFields, Map<String, Object> parsedObject) {
|
||||||
|
if (!highlightFields.isEmpty()) {
|
||||||
|
for (Map.Entry<String, HighlightField> entry : highlightFields.entrySet()) {
|
||||||
|
String fieldName = entry.getKey();
|
||||||
|
Text[] fragments = entry.getValue().fragments();
|
||||||
|
StringBuilder highlightedValue = new StringBuilder();
|
||||||
|
for (Text fragment : fragments) {
|
||||||
|
highlightedValue.append(fragment);
|
||||||
|
}
|
||||||
|
parsedObject.put(fieldName, highlightedValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SearchRequest builderRequest(String indexName,Map<String, Object> docMsg) {
|
||||||
|
SearchRequest request = new SearchRequest(indexName);
|
||||||
|
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
|
||||||
|
|
||||||
|
// 构造查询条件
|
||||||
|
QueryBuilder queryBuilder = builderQuery(docMsg);
|
||||||
|
sourceBuilder.query(queryBuilder);
|
||||||
|
|
||||||
|
// 设置分页参数
|
||||||
|
setPaginationParameters(docMsg,sourceBuilder);
|
||||||
|
|
||||||
|
// 设置排序参数
|
||||||
|
setSortParameters(docMsg,sourceBuilder);
|
||||||
|
|
||||||
|
// 设置高亮参数
|
||||||
|
setHighlightParameters(docMsg,sourceBuilder);
|
||||||
|
|
||||||
|
request.source(sourceBuilder);
|
||||||
|
|
||||||
|
// 打印请求参数
|
||||||
|
log.debug("ES 搜索 请求参数: {}",sourceBuilder.toString());
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setHighlightParameters(Map<String, Object> docMsg, SearchSourceBuilder sourceBuilder) {
|
||||||
|
// 获取高亮参数
|
||||||
|
Map<String,Object> highlight = (Map<String, Object>) docMsg.get("highlight");
|
||||||
|
// 判断是否需要高亮
|
||||||
|
if(highlight != null){
|
||||||
|
// 创建高亮构建器
|
||||||
|
HighlightBuilder highlightBuilder = new HighlightBuilder();
|
||||||
|
// 获取高亮字段
|
||||||
|
List<String> fields = (List<String>) highlight.getOrDefault("fields", Collections.emptyList());
|
||||||
|
// 获取高亮前缀
|
||||||
|
String preTag = (String) highlight.getOrDefault("preTag", "<em>");
|
||||||
|
// 获取高亮后缀
|
||||||
|
String postTag = (String) highlight.getOrDefault("postTag", "</em>");
|
||||||
|
// 循环设置高亮字段
|
||||||
|
for (String field : fields) {
|
||||||
|
highlightBuilder.field(field);
|
||||||
|
}
|
||||||
|
// 设置高亮包裹
|
||||||
|
highlightBuilder.preTags(preTag).postTags(postTag);
|
||||||
|
// 设置高亮
|
||||||
|
sourceBuilder.highlighter(highlightBuilder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSortParameters(Map<String, Object> docMsg, SearchSourceBuilder sourceBuilder) {
|
||||||
|
Map sort = (Map) docMsg.get("sort");
|
||||||
|
if(sort != null){
|
||||||
|
Object sortOrderObject = sort.get("sortOrder");
|
||||||
|
Object fieldObject = sort.get("field");
|
||||||
|
|
||||||
|
if(sortOrderObject instanceof String && fieldObject instanceof String){
|
||||||
|
String sortOrder = (String) sortOrderObject;
|
||||||
|
String field = (String) fieldObject;
|
||||||
|
|
||||||
|
if("asc".equalsIgnoreCase(sortOrder) || "desc".equalsIgnoreCase(sortOrder)){
|
||||||
|
SortOrder sortOrderEnum = "asc".equalsIgnoreCase(sortOrder) ? SortOrder.ASC : SortOrder.DESC;
|
||||||
|
log.info("排序字段:"+field+",排序方式:"+sortOrderEnum);
|
||||||
|
sourceBuilder.sort(field,sortOrderEnum);
|
||||||
|
}else {
|
||||||
|
SortOrder sortOrderEnum = SortOrder.ASC;
|
||||||
|
log.info("排序字段:"+field+",排序方式:"+sortOrderEnum);
|
||||||
|
sourceBuilder.sort(field,sortOrderEnum);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
throw new IllegalArgumentException("排序参数有误");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPaginationParameters(Map<String, Object> docMsg, SearchSourceBuilder sourceBuilder) {
|
||||||
|
// 从条件中获取分页信息
|
||||||
|
Map<String,Object> pagination = (Map<String, Object>) docMsg.get("pagination");
|
||||||
|
// 如果没有分页信息,则不设置分页参数
|
||||||
|
if(pagination == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 获取分页参数
|
||||||
|
int page;
|
||||||
|
int limit;
|
||||||
|
try {
|
||||||
|
// 获取分页参数
|
||||||
|
page = Integer.parseInt(pagination.getOrDefault("page","1").toString());
|
||||||
|
limit = Integer.parseInt(pagination.getOrDefault("limit","10").toString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new IllegalArgumentException("分页参数有误", e);
|
||||||
|
}
|
||||||
|
// 计算分页参数
|
||||||
|
int form = (page - 1) * limit;
|
||||||
|
// 设置分页参数
|
||||||
|
sourceBuilder.from(form).size(limit);
|
||||||
|
// 打印分页参数
|
||||||
|
log.debug("Pagination parameters set: page={}, limit={}, from={}" , page, limit, form);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private QueryBuilder builderQuery(Map<String, Object> docMsg) {
|
||||||
|
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
|
||||||
|
|
||||||
|
if(docMsg != null && !docMsg.isEmpty()){
|
||||||
|
for (Map.Entry<String, Object> entry : docMsg.entrySet()) {
|
||||||
|
String key = entry.getKey();
|
||||||
|
Object value = entry.getValue();
|
||||||
|
|
||||||
|
if(value instanceof Map && ((Map<?, ?>) value).containsKey("range")){
|
||||||
|
Map<String, Object> rangeParms = (Map<String, Object>) value;
|
||||||
|
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(key);
|
||||||
|
|
||||||
|
String gt = (String) rangeParms.get("gt");
|
||||||
|
|
||||||
|
if(StringUtils.isNotBlank(gt)){
|
||||||
|
rangeQueryBuilder.gt(gt);
|
||||||
|
}
|
||||||
|
|
||||||
|
String gte = (String) rangeParms.get("gte");
|
||||||
|
if(StringUtils.isNotBlank(gte)){
|
||||||
|
rangeQueryBuilder.gte(gte);
|
||||||
|
}
|
||||||
|
|
||||||
|
String lt = (String) rangeParms.get("lt");
|
||||||
|
if(StringUtils.isNotBlank(lt)){
|
||||||
|
rangeQueryBuilder.lt(lt);
|
||||||
|
}
|
||||||
|
|
||||||
|
String lte = (String) rangeParms.get("lte");
|
||||||
|
if(StringUtils.isNotBlank(lte)){
|
||||||
|
rangeQueryBuilder.lte(lte);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolQueryBuilder.filter(rangeQueryBuilder);
|
||||||
|
}else if(value instanceof String) {
|
||||||
|
boolQueryBuilder.filter(QueryBuilders.matchQuery(key,value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return boolQueryBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkedIndexName(String indexName){
|
||||||
|
if(StringUtils.isBlank(indexName)){
|
||||||
|
throw new ServiceException("索引名称为空,请重试");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,203 @@
|
||||||
|
package com.bawei.es.service.impl;
|
||||||
|
|
||||||
|
import com.bawei.common.core.exception.ServiceException;
|
||||||
|
import com.bawei.common.core.utils.StringUtils;
|
||||||
|
import com.bawei.es.service.EsIndexService;
|
||||||
|
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
|
||||||
|
import org.elasticsearch.client.RequestOptions;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.elasticsearch.client.indices.CreateIndexRequest;
|
||||||
|
import org.elasticsearch.client.indices.CreateIndexResponse;
|
||||||
|
import org.elasticsearch.client.indices.GetIndexRequest;
|
||||||
|
import org.elasticsearch.client.indices.GetIndexResponse;
|
||||||
|
import org.elasticsearch.cluster.metadata.MappingMetadata;
|
||||||
|
import org.elasticsearch.common.settings.Setting;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.xcontent.XContentFactory;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EsIndexServiceImpl implements EsIndexService {
|
||||||
|
@Resource
|
||||||
|
private RestHighLevelClient restHighLevelClient;
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(EsIndexService.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean findIndex(String indexName) {
|
||||||
|
if (indexName == null || indexName.isEmpty()){
|
||||||
|
throw new ServiceException("索引名称不能为空");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
GetIndexRequest request = new GetIndexRequest(indexName);
|
||||||
|
GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
|
||||||
|
// 直接使用 response.indices() 是否包含 indexName 来判断
|
||||||
|
String[] indices = response.getIndices();
|
||||||
|
for (String index : indices) {
|
||||||
|
if (index.equals(indexName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 特别处理 index_not_found_exception
|
||||||
|
if (e.getMessage().contains("no such index")) {
|
||||||
|
logger.info("索引 [{}] 不存在", indexName);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// 记录其他类型的异常
|
||||||
|
logger.error("查询索引 [{}] 状态时发生错误: {}", indexName, e.getMessage(), e);
|
||||||
|
throw new ServiceException("查询索引状态时发生错误");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createIndex(String indexName, Map<String,Object> docMsg) {
|
||||||
|
if (StringUtils.isBlank(indexName)) {
|
||||||
|
throw new ServiceException("索引名称不可为空");
|
||||||
|
}
|
||||||
|
// 判断索引是否存在
|
||||||
|
boolean index = this.findIndex(indexName);
|
||||||
|
if(index){
|
||||||
|
throw new ServiceException("索引" + indexName + "已存在");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
//
|
||||||
|
Settings.Builder settingsBuilder = Settings.builder();
|
||||||
|
XContentBuilder mappingBuilder = null;
|
||||||
|
|
||||||
|
if(docMsg != null && !docMsg.isEmpty()){
|
||||||
|
mappingBuilder = createMapping(docMsg);
|
||||||
|
}
|
||||||
|
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName)
|
||||||
|
.settings(settingsBuilder);
|
||||||
|
if(mappingBuilder != null){
|
||||||
|
createIndexRequest.mapping(mappingBuilder);
|
||||||
|
}
|
||||||
|
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
|
||||||
|
return createIndexResponse.isAcknowledged();
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
System.out.println("创建索引时发生错误: " + e.getMessage());
|
||||||
|
throw new ServiceException("创建索引时发生错误");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建文档映射
|
||||||
|
* @param docMsg 包含文档字段及其类型的映射
|
||||||
|
* @return XContentBuilder 对象,包含构建的文档映射结构
|
||||||
|
* @throws IOException 如果构建过程中发生IO异常
|
||||||
|
*/
|
||||||
|
private XContentBuilder createMapping(Map<String,Object> docMsg) throws IOException {
|
||||||
|
// 初始化XContentBuilder对象,开始构建JSON对象
|
||||||
|
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
|
||||||
|
.startObject()
|
||||||
|
.startObject("properties");
|
||||||
|
|
||||||
|
// 遍历docMsg,为每个字段构建映射
|
||||||
|
for (Map.Entry<String, Object> entry : docMsg.entrySet()) {
|
||||||
|
String key = entry.getKey();
|
||||||
|
Object value = entry.getValue();
|
||||||
|
xContentBuilder.startObject(key);
|
||||||
|
|
||||||
|
if(value instanceof Map){
|
||||||
|
// 如果字段值是Map类型,则递归处理
|
||||||
|
Map<String,Object> stringObjectMap = (Map<String, Object>) value;
|
||||||
|
// 遍历内部映射,添加到当前字段
|
||||||
|
for (Map.Entry<String, Object> stringObjectEntry : stringObjectMap.entrySet()) {
|
||||||
|
String key1 = stringObjectEntry.getKey();
|
||||||
|
Object value1 = stringObjectEntry.getValue();
|
||||||
|
xContentBuilder.field(key1,value1);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
// 如果字段值不是Map类型,将其作为类型字段添加
|
||||||
|
xContentBuilder.field("type",value.toString());
|
||||||
|
}
|
||||||
|
xContentBuilder.endObject();
|
||||||
|
}
|
||||||
|
// 结束"properties"对象和整个JSON对象的构建
|
||||||
|
xContentBuilder.endObject().endObject();
|
||||||
|
return xContentBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteIndex(String indexName) {
|
||||||
|
// 判空
|
||||||
|
if(StringUtils.isBlank(indexName)){
|
||||||
|
throw new ServiceException("索引名称不可为空");
|
||||||
|
}
|
||||||
|
// 删除索引
|
||||||
|
try {
|
||||||
|
restHighLevelClient.indices().delete(new DeleteIndexRequest(indexName), RequestOptions.DEFAULT);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("删除索引失败: " + e.getMessage());
|
||||||
|
throw new ServiceException("删除索引失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getMapping(String indexName) {
|
||||||
|
if(StringUtils.isBlank(indexName)){
|
||||||
|
throw new RuntimeException("索引名称不能为空");
|
||||||
|
}
|
||||||
|
// 创建索引请求
|
||||||
|
GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
|
||||||
|
try {
|
||||||
|
// 获取索引
|
||||||
|
GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
|
||||||
|
for (String index : getIndexResponse.getIndices()) {
|
||||||
|
// 判断索引
|
||||||
|
if(index.equals(indexName)){
|
||||||
|
// 获取映射
|
||||||
|
Map<String, MappingMetadata> mappings = getIndexResponse.getMappings();
|
||||||
|
MappingMetadata mappingMetadata = mappings.get(indexName);
|
||||||
|
// 判断映射是否为空
|
||||||
|
if(mappingMetadata != null){
|
||||||
|
// 获取映射
|
||||||
|
Map<String,Object> properties = (Map<String, Object>) mappingMetadata.getSourceAsMap().get("properties");
|
||||||
|
// 判断映射是否为空
|
||||||
|
if(properties == null){
|
||||||
|
throw new ServiceException("索引映射为空");
|
||||||
|
}
|
||||||
|
// 返回映射
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
throw new ServiceException("索引不存在,请重试");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateIndex(String indexName, Map<String, Object> docMsg) {
|
||||||
|
try {
|
||||||
|
if (indexName!=null && !indexName.isEmpty()){
|
||||||
|
if (Boolean.FALSE.equals(findIndex(indexName))) {
|
||||||
|
createIndex(indexName,docMsg);
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
deleteIndex(indexName);
|
||||||
|
createIndex(indexName,docMsg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
throw new ServiceException("索引名字为空,请重试!!!");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,194 +0,0 @@
|
||||||
package com.bawei.es.service.impl;
|
|
||||||
|
|
||||||
import com.bawei.common.core.exception.ServiceException;
|
|
||||||
import com.bawei.es.service.IndexService;
|
|
||||||
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
|
|
||||||
import org.elasticsearch.client.RequestOptions;
|
|
||||||
import org.elasticsearch.client.RestHighLevelClient;
|
|
||||||
import org.elasticsearch.client.indices.CreateIndexRequest;
|
|
||||||
import org.elasticsearch.client.indices.CreateIndexResponse;
|
|
||||||
import org.elasticsearch.client.indices.GetIndexRequest;
|
|
||||||
import org.elasticsearch.client.indices.GetIndexResponse;
|
|
||||||
import org.elasticsearch.cluster.metadata.MappingMetadata;
|
|
||||||
import org.elasticsearch.common.settings.Settings;
|
|
||||||
import org.elasticsearch.xcontent.XContentBuilder;
|
|
||||||
import org.elasticsearch.xcontent.XContentFactory;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: 31966
|
|
||||||
* @Project: mall-product
|
|
||||||
* @Package: com.bwie.es.service.impl
|
|
||||||
* @ClassName: EsServiceImpl
|
|
||||||
* @Description: 请在此处填写具体描述
|
|
||||||
* @Date: 2024/4/22 20:56
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public class IndexServiceImpl implements IndexService {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RestHighLevelClient restHighLevelClient;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean exist(String indexName) {
|
|
||||||
if (indexName == null || indexName.isEmpty()){
|
|
||||||
throw new ServiceException("索引名称不能为空");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
GetIndexRequest request = new GetIndexRequest(indexName);
|
|
||||||
GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
|
|
||||||
// 检查响应中是否包含指定的索引
|
|
||||||
for (String index : response.getIndices()) {
|
|
||||||
if (index.equals(indexName)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// 处理异常,例如记录日志或返回false表示索引不存在
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean index(String indexName, Map<String, Object> mappings) {
|
|
||||||
// 参数校验
|
|
||||||
if (indexName == null || indexName.isEmpty()) {
|
|
||||||
throw new ServiceException("Index name cannot be null or empty");
|
|
||||||
}
|
|
||||||
// 判断索引是否存在
|
|
||||||
boolean indexExists = exist(indexName);
|
|
||||||
if (indexExists) {
|
|
||||||
throw new ServiceException("索引 " + indexName + " 已存在");
|
|
||||||
}
|
|
||||||
// 创建索引并设置映射(根据mappings非空情况)
|
|
||||||
try {
|
|
||||||
Settings.Builder settingsBuilder = Settings.builder();
|
|
||||||
XContentBuilder mappingBuilder = null;
|
|
||||||
|
|
||||||
if (mappings != null && !mappings.isEmpty()) {
|
|
||||||
// 设置映射
|
|
||||||
mappingBuilder = createMapping(mappings);
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateIndexRequest request = new CreateIndexRequest(indexName)
|
|
||||||
.settings(settingsBuilder);
|
|
||||||
if (mappingBuilder!=null){
|
|
||||||
request.mapping(mappingBuilder);
|
|
||||||
}
|
|
||||||
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
|
|
||||||
return response.isAcknowledged();
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.err.println("创建索引时发生错误: " + e.getMessage());
|
|
||||||
throw new ServiceException("创建索引时发生错误");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean updataIndex(String indexName, Map<String, Object> mappings) {
|
|
||||||
try {
|
|
||||||
if (indexName!=null && !indexName.isEmpty()){
|
|
||||||
if (Boolean.FALSE.equals(exist(indexName))) {
|
|
||||||
index(indexName,mappings);
|
|
||||||
return true;
|
|
||||||
}else {
|
|
||||||
deleteIndex(indexName);
|
|
||||||
index(indexName,mappings);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
throw new ServiceException("索引名字为空,请重试!!!");
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean deleteIndex(String indexName) {
|
|
||||||
// 删除索引
|
|
||||||
try {
|
|
||||||
restHighLevelClient.indices().delete(new DeleteIndexRequest(indexName), RequestOptions.DEFAULT);
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("Error deleting index: " + e.getMessage());
|
|
||||||
throw new ServiceException("Error deleting index");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, Object> getMapping(String indexName) {
|
|
||||||
if (indexName == null || indexName.isEmpty()) {
|
|
||||||
throw new ServiceException("索引名称不能为空");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
GetIndexRequest request = new GetIndexRequest(indexName);
|
|
||||||
GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
|
|
||||||
|
|
||||||
// 检查响应中是否包含指定的索引
|
|
||||||
for (String index : response.getIndices()) {
|
|
||||||
if (index.equals(indexName)) {
|
|
||||||
Map<String, MappingMetadata> mappings = response.getMappings();
|
|
||||||
|
|
||||||
// 提取并返回指定索引的映射结构
|
|
||||||
MappingMetadata mappingMetadata = mappings.get(indexName);
|
|
||||||
if (mappingMetadata != null) {
|
|
||||||
Map<String,Object> map = (Map<String, Object>) mappingMetadata.getSourceAsMap().get("properties");
|
|
||||||
if (map==null){
|
|
||||||
throw new ServiceException("索引映射为空");
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// 处理异常,例如记录日志
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 索引不存在或获取映射失败,返回null
|
|
||||||
throw new ServiceException("索引不存在,请重试");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据给定的映射创建XContentBuilder
|
|
||||||
*/
|
|
||||||
private XContentBuilder createMapping(Map<String, Object> mappings) throws IOException {
|
|
||||||
XContentBuilder builder = XContentFactory.jsonBuilder()
|
|
||||||
.startObject()
|
|
||||||
.startObject("properties");
|
|
||||||
|
|
||||||
for (Map.Entry<String, Object> entry : mappings.entrySet()) {
|
|
||||||
String fieldName = entry.getKey();
|
|
||||||
Object fieldConfig = entry.getValue();
|
|
||||||
|
|
||||||
builder.startObject(fieldName); // Start field mapping
|
|
||||||
|
|
||||||
if (fieldConfig instanceof Map) {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String, Object> nestedMapping = (Map<String, Object>) fieldConfig;
|
|
||||||
|
|
||||||
for (Map.Entry<String, Object> nestedEntry : nestedMapping.entrySet()) {
|
|
||||||
String nestedFieldName = nestedEntry.getKey();
|
|
||||||
Object nestedFieldConfig = nestedEntry.getValue();
|
|
||||||
|
|
||||||
builder.field(nestedFieldName, nestedFieldConfig);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
builder.field("type", fieldConfig.toString()); // Add field type
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.endObject(); // End field mapping
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.endObject() // End "properties"
|
|
||||||
.endObject(); // End root object
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
Spring Boot Version: ${spring-boot.version}
|
|
||||||
Spring Application Name: ${spring.application.name}
|
|
||||||
_ __ _ _
|
|
||||||
(_) / _|(_)| |
|
|
||||||
_ __ _ _ ___ _ _ _ ______ | |_ _ | | ___
|
|
||||||
| '__|| | | | / _ \ | | | || ||______|| _|| || | / _ \
|
|
||||||
| | | |_| || (_) || |_| || | | | | || || __/
|
|
||||||
|_| \__,_| \___/ \__, ||_| |_| |_||_| \___|
|
|
||||||
__/ |
|
|
||||||
|___/
|
|
|
@ -1,12 +1,12 @@
|
||||||
# Tomcat
|
# Tomcat
|
||||||
server:
|
server:
|
||||||
port: 9204
|
port: 9123
|
||||||
|
|
||||||
# Spring
|
# Spring
|
||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
# 应用名称
|
# 应用名称
|
||||||
name: bawei-es
|
name: bawei-base-es
|
||||||
profiles:
|
profiles:
|
||||||
# 环境配置
|
# 环境配置
|
||||||
active: dev
|
active: dev
|
||||||
|
@ -14,14 +14,36 @@ spring:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
# 服务注册地址
|
# 服务注册地址
|
||||||
server-addr: 127.0.0.1:8848
|
server-addr: 124.222.99.46:8848
|
||||||
namespace: 12345678
|
|
||||||
config:
|
config:
|
||||||
# 配置中心地址
|
# 配置中心地址
|
||||||
server-addr: 127.0.0.1:8848
|
server-addr: 124.222.99.46:8848
|
||||||
# 配置文件格式
|
# 配置文件格式
|
||||||
file-extension: yml
|
file-extension: yml
|
||||||
# 共享配置
|
# 共享配置
|
||||||
shared-configs:
|
shared-configs:
|
||||||
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||||
namespace: 12345678
|
springdoc:
|
||||||
|
swagger-ui:
|
||||||
|
path: /swagger-ui.html
|
||||||
|
tags-sorter: alpha
|
||||||
|
operations-sorter: alpha
|
||||||
|
api-docs:
|
||||||
|
path: v3/api-docs # 指定生成文档的路径,网关会访问这个路径来拉取文档
|
||||||
|
group-configs:
|
||||||
|
- group: 'default'
|
||||||
|
paths-to-match: '/**'
|
||||||
|
packages-to-scan: com.keyl1me.edu.controller # 指定要扫描的包
|
||||||
|
|
||||||
|
knife4j:
|
||||||
|
enable: true # 开启knife4j接口文档美化
|
||||||
|
setting:
|
||||||
|
language: zh_cn # 指定语言
|
||||||
|
# feign 配置
|
||||||
|
feign:
|
||||||
|
compression:
|
||||||
|
request:
|
||||||
|
enabled: true
|
||||||
|
min-request-size: 8192
|
||||||
|
response:
|
||||||
|
enabled: true
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<configuration scan="true" scanPeriod="60 seconds" debug="false">
|
|
||||||
<!-- 日志存放路径 -->
|
|
||||||
<property name="log.path" value="logs/bawei-file" />
|
|
||||||
<!-- 日志输出格式 -->
|
|
||||||
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
|
|
||||||
|
|
||||||
<!-- 控制台输出 -->
|
|
||||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
|
||||||
<encoder>
|
|
||||||
<pattern>${log.pattern}</pattern>
|
|
||||||
</encoder>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<!-- 系统日志输出 -->
|
|
||||||
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
|
||||||
<file>${log.path}/info.log</file>
|
|
||||||
<!-- 循环政策:基于时间创建日志文件 -->
|
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
|
||||||
<!-- 日志文件名格式 -->
|
|
||||||
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
|
||||||
<!-- 日志最大的历史 60天 -->
|
|
||||||
<maxHistory>60</maxHistory>
|
|
||||||
</rollingPolicy>
|
|
||||||
<encoder>
|
|
||||||
<pattern>${log.pattern}</pattern>
|
|
||||||
</encoder>
|
|
||||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
|
||||||
<!-- 过滤的级别 -->
|
|
||||||
<level>INFO</level>
|
|
||||||
<!-- 匹配时的操作:接收(记录) -->
|
|
||||||
<onMatch>ACCEPT</onMatch>
|
|
||||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
|
||||||
<onMismatch>DENY</onMismatch>
|
|
||||||
</filter>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
|
||||||
<file>${log.path}/error.log</file>
|
|
||||||
<!-- 循环政策:基于时间创建日志文件 -->
|
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
|
||||||
<!-- 日志文件名格式 -->
|
|
||||||
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
|
||||||
<!-- 日志最大的历史 60天 -->
|
|
||||||
<maxHistory>60</maxHistory>
|
|
||||||
</rollingPolicy>
|
|
||||||
<encoder>
|
|
||||||
<pattern>${log.pattern}</pattern>
|
|
||||||
</encoder>
|
|
||||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
|
||||||
<!-- 过滤的级别 -->
|
|
||||||
<level>ERROR</level>
|
|
||||||
<!-- 匹配时的操作:接收(记录) -->
|
|
||||||
<onMatch>ACCEPT</onMatch>
|
|
||||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
|
||||||
<onMismatch>DENY</onMismatch>
|
|
||||||
</filter>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<!-- 系统模块日志级别控制 -->
|
|
||||||
<logger name="com.bawei" level="info" />
|
|
||||||
<!-- Spring日志级别控制 -->
|
|
||||||
<logger name="org.springframework" level="warn" />
|
|
||||||
|
|
||||||
<root level="info">
|
|
||||||
<appender-ref ref="console" />
|
|
||||||
</root>
|
|
||||||
|
|
||||||
<!--系统操作日志-->
|
|
||||||
<root level="info">
|
|
||||||
<appender-ref ref="file_info" />
|
|
||||||
<appender-ref ref="file_error" />
|
|
||||||
</root>
|
|
||||||
</configuration>
|
|
|
@ -8,14 +8,8 @@
|
||||||
<artifactId>bawei-base</artifactId>
|
<artifactId>bawei-base</artifactId>
|
||||||
<version>3.6.0</version>
|
<version>3.6.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>base-es</artifactId>
|
<artifactId>base-es</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<description>
|
|
||||||
base-es es服务
|
|
||||||
</description>
|
|
||||||
<modules>
|
|
||||||
<module>base-es-server</module>
|
|
||||||
<module>base-es-remote</module>
|
|
||||||
<module>base-es-common</module>
|
|
||||||
</modules>
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.bawei.mall.product.controller;
|
package com.bawei.mall.product.controller;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.io.IOException;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import com.bawei.common.core.domain.R;
|
import com.bawei.common.core.domain.R;
|
||||||
|
@ -9,7 +8,6 @@ import com.bawei.mall.product.domain.reponse.ProductDetailsResponse;
|
||||||
import com.bawei.mall.product.domain.reponse.ProductInfoResponse;
|
import com.bawei.mall.product.domain.reponse.ProductInfoResponse;
|
||||||
import com.bawei.mall.product.domain.request.ProductInfoRequest;
|
import com.bawei.mall.product.domain.request.ProductInfoRequest;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import io.swagger.annotations.ApiParam;
|
import io.swagger.annotations.ApiParam;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
@ -49,7 +47,10 @@ public class MallProductInfoController extends BaseController
|
||||||
List<MallProductInfo> list = mallProductInfoService.selectMallProductInfoList(mallProductInfo);
|
List<MallProductInfo> list = mallProductInfoService.selectMallProductInfoList(mallProductInfo);
|
||||||
return getDataTable(list);
|
return getDataTable(list);
|
||||||
}
|
}
|
||||||
|
@RequestMapping("/show")
|
||||||
|
public void queryJson(){
|
||||||
|
mallProductInfoService.queryJson();
|
||||||
|
}
|
||||||
@PostMapping("/syncList")
|
@PostMapping("/syncList")
|
||||||
public TableDataInfo syncList(@RequestBody MallProductInfo mallProductInfo)
|
public TableDataInfo syncList(@RequestBody MallProductInfo mallProductInfo)
|
||||||
{
|
{
|
||||||
|
@ -85,6 +86,14 @@ public class MallProductInfoController extends BaseController
|
||||||
util.exportExcel(response, list, "商品信息数据");
|
util.exportExcel(response, list, "商品信息数据");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加es查询
|
||||||
|
*/
|
||||||
|
@GetMapping("/esList")
|
||||||
|
public R esList(){
|
||||||
|
return mallProductInfoService.esList();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取商品信息详细信息
|
* 获取商品信息详细信息
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.bawei.mall.product.service;
|
package com.bawei.mall.product.service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
import com.bawei.mall.product.domain.MallProductInfo;
|
import com.bawei.mall.product.domain.MallProductInfo;
|
||||||
import com.bawei.mall.product.domain.reponse.ProductDetailsResponse;
|
import com.bawei.mall.product.domain.reponse.ProductDetailsResponse;
|
||||||
import com.bawei.mall.product.domain.reponse.ProductInfoResponse;
|
import com.bawei.mall.product.domain.reponse.ProductInfoResponse;
|
||||||
|
@ -70,5 +72,11 @@ public interface IMallProductInfoService
|
||||||
*/
|
*/
|
||||||
Long selectMallProductInfoCount (MallProductInfo mallProductInfo);
|
Long selectMallProductInfoCount (MallProductInfo mallProductInfo);
|
||||||
|
|
||||||
void unmout(Long id, String type);
|
void queryJson();
|
||||||
|
|
||||||
|
void unmout(Long id, java.lang.String status);
|
||||||
|
|
||||||
|
|
||||||
|
R esList();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,26 @@
|
||||||
package com.bawei.mall.product.service.impl;
|
package com.bawei.mall.product.service.impl;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.alibaba.fastjson.TypeReference;
|
||||||
|
import com.bawei.common.core.domain.R;
|
||||||
import com.bawei.common.core.exception.ServiceException;
|
import com.bawei.common.core.exception.ServiceException;
|
||||||
import com.bawei.common.core.utils.DateUtils;
|
import com.bawei.common.core.utils.DateUtils;
|
||||||
import com.bawei.common.core.utils.StringUtils;
|
|
||||||
import com.bawei.common.core.utils.bean.BeanUtils;
|
import com.bawei.common.core.utils.bean.BeanUtils;
|
||||||
import com.bawei.common.core.utils.thread.ThreadPool;
|
|
||||||
import com.bawei.common.rabbit.domain.Message;
|
import com.bawei.common.rabbit.domain.Message;
|
||||||
import com.bawei.common.rabbit.enums.QueueEnum;
|
import com.bawei.common.rabbit.enums.QueueEnum;
|
||||||
import com.bawei.common.security.utils.SecurityUtils;
|
import com.bawei.common.security.utils.SecurityUtils;
|
||||||
|
import com.bawei.es.remote.api.RemoteDocumentService;
|
||||||
|
import com.bawei.es.remote.api.RemoteIndexService;
|
||||||
import com.bawei.mall.product.cache.ProductInfoCache;
|
import com.bawei.mall.product.cache.ProductInfoCache;
|
||||||
import com.bawei.mall.product.domain.MallProductRuleInfo;
|
import com.bawei.mall.product.domain.MallProductRuleInfo;
|
||||||
import com.bawei.mall.product.domain.MallProductSkuInfo;
|
import com.bawei.mall.product.domain.MallProductSkuInfo;
|
||||||
|
@ -20,6 +31,7 @@ import com.bawei.mall.product.domain.reponse.ProductInfoResponse;
|
||||||
import com.bawei.mall.product.domain.request.ProductInfoRequest;
|
import com.bawei.mall.product.domain.request.ProductInfoRequest;
|
||||||
import com.bawei.mall.product.service.IMallProductRuleInfoService;
|
import com.bawei.mall.product.service.IMallProductRuleInfoService;
|
||||||
import com.bawei.mall.product.service.IMallProductSkuInfoService;
|
import com.bawei.mall.product.service.IMallProductSkuInfoService;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -27,7 +39,6 @@ import com.bawei.mall.product.mapper.MallProductInfoMapper;
|
||||||
import com.bawei.mall.product.domain.MallProductInfo;
|
import com.bawei.mall.product.domain.MallProductInfo;
|
||||||
import com.bawei.mall.product.service.IMallProductInfoService;
|
import com.bawei.mall.product.service.IMallProductInfoService;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.w3c.dom.ranges.RangeException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品信息Service业务层处理
|
* 商品信息Service业务层处理
|
||||||
|
@ -54,6 +65,12 @@ public class MallProductInfoServiceImpl implements IMallProductInfoService
|
||||||
@Autowired
|
@Autowired
|
||||||
private RabbitTemplate rabbitTemplate;
|
private RabbitTemplate rabbitTemplate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteDocumentService remoteDocumentService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteIndexService remoteIndexService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询商品信息
|
* 查询商品信息
|
||||||
*
|
*
|
||||||
|
@ -120,7 +137,7 @@ public class MallProductInfoServiceImpl implements IMallProductInfoService
|
||||||
@Transactional
|
@Transactional
|
||||||
public int insertMallProductInfo(ProductInfoRequest productInfoRequest)
|
public int insertMallProductInfo(ProductInfoRequest productInfoRequest)
|
||||||
{
|
{
|
||||||
productInfoRequest.setCreateBy(String.valueOf(SecurityUtils.getUserId()));
|
productInfoRequest.setCreateBy(java.lang.String.valueOf(SecurityUtils.getUserId()));
|
||||||
productInfoRequest.setCreateTime(DateUtils.getNowDate());
|
productInfoRequest.setCreateTime(DateUtils.getNowDate());
|
||||||
int i = mallProductInfoMapper.insertMallProductInfo(productInfoRequest);
|
int i = mallProductInfoMapper.insertMallProductInfo(productInfoRequest);
|
||||||
if (i == 0){
|
if (i == 0){
|
||||||
|
@ -200,38 +217,73 @@ public class MallProductInfoServiceImpl implements IMallProductInfoService
|
||||||
return mallProductInfoMapper.selectMallProductInfoCount(mallProductInfo);
|
return mallProductInfoMapper.selectMallProductInfoCount(mallProductInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unmout(Long id, String status) {
|
public void queryJson() {
|
||||||
if(id==null && id==0){
|
Path pathJson = Paths.get(".");
|
||||||
throw new RuntimeException("id不能为空");
|
try {
|
||||||
}
|
List<Path> collect = Files.walk(pathJson)
|
||||||
if (status==null || status.equals("")){
|
.filter(Files::isRegularFile)
|
||||||
throw new RuntimeException("商品状态不能为空");
|
.filter(path -> path.toString().endsWith(".json"))
|
||||||
}
|
.collect(Collectors.toList());
|
||||||
MallProductInfo mallProductInfo = mallProductInfoMapper.selectMallProductInfoById(id);
|
//根据文件路径查找文件
|
||||||
if (mallProductInfo.getStatus().equals("0")){
|
collect.forEach(path -> {
|
||||||
if (status.equals("1")){
|
try {
|
||||||
|
String json = new String(Files.readAllBytes(path));
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(json);
|
||||||
|
Object javaObject = JSONObject.toJavaObject(jsonObject, Object.class);
|
||||||
|
System.out.println(javaObject);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unmout(Long id, java.lang.String status) {
|
||||||
|
if(id==null && id==0){
|
||||||
|
throw new RuntimeException("id不能为空");
|
||||||
|
}
|
||||||
|
if (status==null || status.equals("")){
|
||||||
|
throw new RuntimeException("商品状态不能为空");
|
||||||
|
}
|
||||||
|
MallProductInfo mallProductInfo = mallProductInfoMapper.selectMallProductInfoById(id);
|
||||||
|
if (mallProductInfo==null){
|
||||||
|
throw new RuntimeException("商品不存在");
|
||||||
|
}
|
||||||
|
//判断修改的状态和数据库里的状态是否冲突
|
||||||
|
if (mallProductInfo.getStatus().equals("0") && status.equals("0")){
|
||||||
|
throw new RuntimeException("商品已上架");
|
||||||
|
}else if (mallProductInfo.getStatus().equals("1") && status.equals("1")){
|
||||||
|
throw new RuntimeException("商品已下架");
|
||||||
|
}
|
||||||
|
R shop = remoteIndexService.exist("shop");
|
||||||
|
if (shop.isSuccess()){
|
||||||
|
R r = remoteIndexService.deleteIndex("shop");
|
||||||
|
if (r.isSuccess()){
|
||||||
|
//删除该索引后,进行修改数据
|
||||||
mallProductInfo.setStatus(status);
|
mallProductInfo.setStatus(status);
|
||||||
mallProductInfoMapper.updateMallProductInfo(mallProductInfo);
|
mallProductInfoMapper.updateMallProductInfo(mallProductInfo);
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
throw new RuntimeException("商品已上架");
|
throw new RuntimeException("删除索引失败");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}else {
|
|
||||||
if (status.equals("1")){
|
|
||||||
throw new RuntimeException("商品已下架");
|
|
||||||
}else {
|
|
||||||
mallProductInfo.setStatus(status);
|
|
||||||
mallProductInfoMapper.updateMallProductInfo(mallProductInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R esList() {
|
||||||
|
//添加es列表查询
|
||||||
|
if (remoteIndexService.exist("shop").isSuccess()){
|
||||||
|
//查询es列表
|
||||||
|
R shop = remoteDocumentService.queryList("shop", null);
|
||||||
|
return R.ok(shop.getData());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"dynamic": "strict",
|
||||||
|
"properties": {
|
||||||
|
"mainImage": {
|
||||||
|
"type": "keyword"
|
||||||
|
},
|
||||||
|
"spuid": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"skuId": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"mainTitle": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"subTitle": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"price": {
|
||||||
|
"type": "scaled_float",
|
||||||
|
"scaling_factor": 100
|
||||||
|
},
|
||||||
|
"productTypeValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productTypeName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productBrandValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productBrandName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productRuleValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productRuleName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productDesc": {
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"dynamic": "strict",
|
||||||
|
"properties": {
|
||||||
|
"mainImage": {
|
||||||
|
"type": "keyword"
|
||||||
|
},
|
||||||
|
"spuid": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"skuId": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"mainTitle": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"subTitle": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"price": {
|
||||||
|
"type": "scaled_float",
|
||||||
|
"scaling_factor": 100
|
||||||
|
},
|
||||||
|
"productTypeValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productTypeName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productBrandValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productBrandName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productRuleValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productRuleName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productDesc": {
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"dynamic": "strict",
|
||||||
|
"properties": {
|
||||||
|
"mainImage": {
|
||||||
|
"type": "keyword"
|
||||||
|
},
|
||||||
|
"spuid": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"skuId": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"mainTitle": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"subTitle": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"price": {
|
||||||
|
"type": "scaled_float",
|
||||||
|
"scaling_factor": 100
|
||||||
|
},
|
||||||
|
"productTypeValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productTypeName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productBrandValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productBrandName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productRuleValue": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"productRuleName": {
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
|
"productDesc": {
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue