简介:该文章会介绍solr整合springboot,操作api 使用两种方式,SolrClient,SolrTemplate 两种方式基本使用方法与对比。其实大家学习完后会发现SolrTemplate 通过代理工厂模式对SolrClient 逻辑封装一层,感兴趣的朋友可以往下点开看源码看看,这里不做详细点缀。
首先需要安装solr 并且配置相应的账号密码
可以参考前写的文章:
Sorl环境搭建与mysql表导入数据
solr配置账号权限登录
目录结构介绍
目录介绍:
annotation 注解目录
bean bean对象
controller 控制层
fiter 拦截器
resourcess 配置文件信息
代码
- application.yml配置文件
spring:
data:
solr:
host: http://127.0.0.1:8983/solr
user: zyy
pwd: 123456
- SolrApplication.java 启动程序
package com.zyy.test;
import com.zyy.test.filter.SolrAuthInterceptor;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.net.URI;
/**
* @author zhaoyy
* @version 1.0
* @description TODO
* @date 2022/7/18
**/
@SpringBootApplication
public class SolrApplication {
@Value("${spring.data.solr.user}")
private String username;
@Value("${spring.data.solr.pwd}")
private String password;
@Value("${spring.data.solr.host}")
private String uri;
public static void main(String[] args) {
SpringApplication.run(SolrApplication.class, args);
}
/***
* @apiNote 配置solr账号密码
* @author zhaoyy
* @date 2021-6-8 15:05
* 拦截器 {@link SolrAuthInterceptor}
* @return {@link HttpSolrClient }
*/
@Bean
public HttpSolrClient solrClient() {
CredentialsProvider provider = new BasicCredentialsProvider();
final URI uri = URI.create(this.uri);
provider.setCredentials(new AuthScope(uri.getHost(), uri.getPort()),
new UsernamePasswordCredentials(username, password));
HttpClientBuilder builder = HttpClientBuilder.create();
// 指定拦截器,用于设置认证信息
builder.addInterceptorFirst(new SolrAuthInterceptor());
builder.setDefaultCredentialsProvider(provider);
CloseableHttpClient httpClient = builder.build();
return new HttpSolrClient.Builder(this.uri).withHttpClient(httpClient).build();
}
}
- SolrAuthInterceptor.java l拦截器
package com.zyy.test.filter;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpCoreContext;
/**
* @author zhaoyy
* @version 1.0
* @description TODO
* @date 2022/8/22
**/
public class SolrAuthInterceptor implements HttpRequestInterceptor {
@Override
public void process(final HttpRequest request, final HttpContext context) {
AuthState authState = (AuthState) context.getAttribute(HttpClientContext.TARGET_AUTH_STATE);
if (authState.getAuthScheme() == null) {
CredentialsProvider provider =
(CredentialsProvider) context.getAttribute(HttpClientContext.CREDS_PROVIDER);
HttpHost httpHost = (HttpHost) context.getAttribute(HttpCoreContext.HTTP_TARGET_HOST);
AuthScope scope = new AuthScope(httpHost.getHostName(), httpHost.getPort());
Credentials credentials = provider.getCredentials(scope);
authState.update(new BasicScheme(), credentials);
}
}
}
- control 控制层代码
BaseController.java
package com.zyy.test.controller;
import com.zyy.test.annotation.FilterName;
import com.zyy.test.bean.MarketRankDb;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import java.lang.reflect.Field;
import java.util.*;
/**
* @author zhaoyy
* @version 1.0
* @description 控制类基础封装对象
* @date 2022/8/22
**/
public class BaseController {
protected SimpleQuery buildParam(MarketRankDb bean) {
SimpleQuery query = new SimpleQuery("*:*");
Map<String, Object> map = BeanMap.create(bean);
Field[] file = bean.getClass().getDeclaredFields();
for (Field field : file) {
String key = field.getName();
FilterName filterName = field.getAnnotation(FilterName.class);
if (Objects.nonNull(filterName)) {
continue;
}
if (StringUtils.isNotBlank(key) && Objects.nonNull(map.get(key))) {
query.addCriteria(new Criteria(key).contains(map.get(key).toString()));
}
}
if (map.containsKey("pageSize") && Optional.ofNullable(map.get("pageSize")).isPresent() &&
map.containsKey("pageNo") && Optional.ofNullable(map.get("pageNo")).isPresent()) {
PageRequest pageRequest = PageRequest.of(bean.getPageNo() - 1, bean.getPageSize());
query.setPageRequest(pageRequest);
}
query.addSort(Sort.by(Sort.Direction.ASC, "id"));
return query;
}
}
ControllerTest.java
package com.zyy.test.controller;
import com.zyy.test.bean.Area;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.IOException;
/**
* @author zhaoyy
* @version 1.0
* @description SolrClient api 操作solr
* @date 2022/8/15
**/
@RestController
@RequestMapping("test")
public class ControllerTest {
@Resource
private SolrClient solrClient;
@PostMapping("add")
public void add(Area area) {
SolrInputDocument document = new SolrInputDocument();
document.setField("id", area.getId());
document.setField("name", area.getName());
try {
solrClient.add(document);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@GetMapping("delete")
public void delete(String query) {
try {
solrClient.deleteByQuery(query);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@PostMapping("update")
public Area update(Area book) {
try {
solrClient.addBean(book);
solrClient.commit();
} catch (IOException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
}
return book;
}
@GetMapping("get")
public Area get(String id) {
try {
SolrDocument solrDocument = solrClient.getById(id);
solrClient.commit();
} catch (IOException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
}
return new Area();
}
@GetMapping("getAll")
public void queryDocument() throws IOException, SolrServerException {
SolrQuery query = new SolrQuery();
//查询条件,默认所有查询
query.setQuery("*:*");
//查询结果的封装对象
QueryResponse queryResponse = solrClient.query(query);
//查询结果
SolrDocumentList results = queryResponse.getResults();
//查询到的数量
long numFound = results.getNumFound();
System.out.println(numFound);
for (SolrDocument result : results) {
System.out.println("id=>" + result.get("id") + "name=>" + result.get("name"));
}
}
@GetMapping("one")
public String one() {
return "hello world!";
}
}
SolrTemplateControllerTest.java
package com.zyy.test.controller;
import com.zyy.test.bean.CollectionNameEnum;
import com.zyy.test.bean.SearchCorpCard;
import org.apache.solr.client.solrj.*;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
/**
* @author zhaoyy
* @version 1.0
* @description SolrClient与SolrTemplate 基本api 使用语法,结论推荐使用SolrTemplate
* @date 2022/8/15
**/
@RestController
@RequestMapping("solr")
public class SolrTemplateControllerTest {
@Resource
private SolrClient solrClient;
/**
* SolrTemplate 其实底部也是通过工厂模式封装了一层 SolrClient 对象
*/
@Resource
private SolrTemplate solrTemplate;
@GetMapping("getName")
public List<SearchCorpCard> getName(String name) {
//设置参数
SimpleQuery query = new SimpleQuery("*:*").
addCriteria(new Criteria("corpName").contains(name));
//起始页
query.setRows(1);
//查询起始页 (pageNo-1)* pageSize
query.setOffset(10L);
ScoredPage<SearchCorpCard> tbItems = solrTemplate.queryForPage(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode(), query, SearchCorpCard.class);
tbItems.forEach(x -> System.out.println(x.toString()));
return tbItems.getContent();
}
@GetMapping("getName1")
public List<SearchCorpCard> getName1(String name) throws SolrServerException, IOException {
SolrQuery query = new SolrQuery();
//查询条件,默认所有查询
query.setQuery("*:*");
QueryResponse queryResponse = solrClient.query(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode(), query);
/**
* 注意使用queryResponse.getBeans 对象转换时需要用注解 @Field 代码底层是通过@Field 标记元素换换,
* 而上面是通过mappering文件类名称映射的
*
*/
List<SearchCorpCard> list = queryResponse.getBeans(SearchCorpCard.class);
list.forEach(x -> System.out.println(x.toString()));
solrClient.commit(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode());
return list;
}
/**
* 新增 solrTemplate 添加对象
*
* @param bean
* @throws SolrServerException
* @throws IOException
*/
@PostMapping("add")
public void add(@RequestBody SearchCorpCard bean) throws SolrServerException, IOException {
UpdateResponse queryResponse = solrTemplate.saveBean(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode(), bean);
solrTemplate.commit(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode());
}
/**
* 新增 solrClient 添加对象
*
* @param bean
* @throws SolrServerException
* @throws IOException
*/
@PostMapping("add1")
public void add1(@RequestBody SearchCorpCard bean) throws SolrServerException, IOException {
solrClient.addBean(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode(), bean);
solrClient.commit(CollectionNameEnum.TB_SEARCH_CORP_CARD.getCode());
}
/**
* 测试接口
*
* @return
*/
@GetMapping("one")
public String one() {
return "hello world!";
}
}
SolrTestController.java
package com.zyy.test.controller;
import com.zyy.test.bean.CollectionNameEnum;
import com.zyy.test.bean.MarketRankDb;
import lombok.extern.slf4j.Slf4j;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.assertj.core.util.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author zhaoyy
* @version 1.0
* @description SolrTemplate api 操作solr
* @date 2022/8/22
**/
@Slf4j
@RestController
@RequestMapping("/test/solr")
public class SolrTestController extends BaseController {
@Autowired
private SolrTemplate solrTemplate;
/**
* 根据参数条件查询列表数据
*
* @param marketRank
* @return
*/
@PostMapping("getList")
private List<MarketRankDb> getList(@RequestBody MarketRankDb marketRank) {
Page<MarketRankDb> page = solrTemplate.query(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode(), buildParam(marketRank), MarketRankDb.class);
return page.getContent();
}
/**
* 分页查询
*
* @param marketRank
* @return
*/
@PostMapping("getPageList")
private List<MarketRankDb> getPageList(@RequestBody MarketRankDb marketRank) {
ScoredPage<MarketRankDb> data = solrTemplate.queryForPage(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode(), buildParam(marketRank), MarketRankDb.class);
log.info("分页返回数据data={}", data);
return data.getContent();
}
/**
* 添加一条记录
*
* @param marketRank
*/
@PostMapping("add")
private void add(@RequestBody MarketRankDb marketRank) {
UpdateResponse response = solrTemplate.saveBeans(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode(), Lists.newArrayList(marketRank));
log.info("修改结果result ={}", response);
solrTemplate.commit(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode());
}
/**
* 更新数据
*
* @param marketRank
*/
@PostMapping("update")
private void update(@RequestBody MarketRankDb marketRank) {
solrTemplate.saveBean(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode(), buildParam(marketRank));
solrTemplate.commit(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode());
}
/**
* 根据参数条件删除对应数据
*
* @param marketRank
*/
@GetMapping("delete")
private void delete(@RequestBody MarketRankDb marketRank) {
solrTemplate.delete(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode(), buildParam(marketRank));
solrTemplate.commit(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode());
}
/**
* 根据ids 多个删除
*
* @param ids
*/
@GetMapping("deletes")
private void delete(@RequestBody List<String> ids) {
solrTemplate.deleteByIds(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode(), ids);
solrTemplate.commit(CollectionNameEnum.TB_MOBILE_MARKET_RANK.getCode());
}
}
- bean对象
SearchCorpCard.java
package com.zyy.test.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
/**
* @author zhaoyy
* @version 1.0
* @description TODO
* @date 2022/8/16
**/
@Data
@AllArgsConstructor
@ToString
@NoArgsConstructor
public class SearchCorpCard implements Serializable {
@Field
private String corpId;
@Field
private String corpName;
@Field
private String registNo;
@Field
private String creditCode;
@Field
private String registfund;
@Field
private String registAddess;
}
MarketRankDb.java
package com.zyy.test.bean;
import com.zyy.test.annotation.FilterName;
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
/**
* 功能:app市场榜单排名DB实体类
*
* @author zhaoyy
* @date 2022-01-13 11:14
*/
@Data
public class MarketRankDb implements Serializable {
@FilterName
private static final long serialVersionUID = -4000524883785970259L;
@Field
private Long id;
@Field
private String market;
@Field
private String listType;
@Field
private String subType;
@Field
private String trackId;
@Field
private String trackName;
@Field
private String description;
@Field
private String downloads;
@Field
private String downloadUrl;
@Field
private String appUpdateTime;
@Field
private String versionCode;
@Field
private String versionDate;
@Field
private String versionName;
@Field
private String fileSize;
@Field
private String packageName;
@Field
private String sellerName;
@Field
private Integer status;
@Field
private String artworkUrl;
@Field
private String yesterdayDownload;
@Field
private String yesterdayComment;
@Field
private String rankChange;
@Field
private Integer rank;
@Field
@FilterName
private Integer pageSize;
@Field
@FilterName
private Integer pageNo;
}
CollectionNameEnum.java
package com.zyy.test.bean;
/**
* solr 集合名称
*
* @author zhaoyy
*/
public enum CollectionNameEnum {
Test("zyy_test", "测试集合"),
TB_SEARCH_CORP_CARD("tb_search_corp_card", "企业搜索集合"),
TB_MOBILE_MARKET_RANK("tb_mobile_market_rank", "手机应用市场app范围排行榜"),
;
private String code;
private String desc;
CollectionNameEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
Area.java
package com.zyy.test.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.SolrDocument;
/**
* @author zhaoyy
* @version 1.0
* @description TODO
* @date 2022/8/15
**/
@Data
@AllArgsConstructor
@ToString
@NoArgsConstructor
@SolrDocument(collection = "zyy_test")
public class Area {
@Field
private Integer code;
@Field
private Integer cityCode;
@Field
private Integer provinceCode;
@Field
private String name;
@Id
@Field
private Integer id;
}
- annotation 过滤器
package com.zyy.test.annotation;
import java.lang.annotation.*;
/**
* 过滤字段参与where查询
*
* @author zhaoyy
*/
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FilterName {
}
- pom.xml maven 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zyy.solr</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>solr-springboot</artifactId>
<description>
1、solr整合使用:分词搜索等使用
</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-boot.version>2.3.1.RELEASE</spring-boot.version>
<drools.version>7.47.0.Final</drools.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<!-- 单元测试不使用Junit4,使用Junit5 -->
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
<exclusions>
<!-- 依赖的spring版本全部以spring boot依赖的为准 -->
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!-- Maven仓库地址 -->
<dependency>
<groupId>com.github.magese</groupId>
<artifactId>ik-analyzer</artifactId>
<version>8.5.0</version>
</dependency>
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>-->
<!-- <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>4.0.18.RELEASE</version>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.4.11</version>
</dependency>
</dependencies>
</project>
创建对应solr 实例
创建命令:solr create -c “zyy-test” 名称需要与CollectionNameEnum code 值对应
表结构:
CREATE TABLE `tb_mobile_market_rank_test` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`market` varchar(30) DEFAULT NULL COMMENT '市场平台',
`list_type` varchar(30) DEFAULT NULL COMMENT '榜单分类',
`sub_type` varchar(30) DEFAULT '' COMMENT '子分类',
`trackid` varchar(50) DEFAULT NULL COMMENT 'app标识ID',
`track_name` varchar(255) DEFAULT NULL COMMENT 'app名称',
`description` text COMMENT '描述',
`downloads` varchar(50) DEFAULT NULL COMMENT '下载量',
`download_url` varchar(1024) DEFAULT NULL COMMENT '下载链接',
`app_update_time` varchar(30) DEFAULT NULL COMMENT '更新时间',
`version_code` varchar(50) DEFAULT NULL COMMENT '版本编码',
`version_date` varchar(30) DEFAULT NULL COMMENT '最近版本更新时间',
`version_name` varchar(50) DEFAULT NULL COMMENT '版本',
`file_size` varchar(50) DEFAULT NULL COMMENT '文件大小',
`package_name` varchar(255) DEFAULT NULL COMMENT '捆绑包ID(包名)',
`seller_name` varchar(500) DEFAULT NULL COMMENT '开发者',
`status` int(2) DEFAULT NULL COMMENT '状态',
`artwork_url` varchar(500) DEFAULT NULL COMMENT 'app-icon图标链接',
`yesterday_download` varchar(50) DEFAULT NULL COMMENT '昨日下载量',
`yesterday_comment` varchar(50) DEFAULT NULL COMMENT '昨日评论量',
`rank_change` varchar(255) DEFAULT NULL COMMENT '排名变动情况',
`rank` int(5) DEFAULT NULL COMMENT '排名',
`CREATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`CREATE_USER` varchar(30) DEFAULT NULL COMMENT '创建人',
`MODIFY_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFY_USER` varchar(30) DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`ID`) USING BTREE,
KEY `idx_tb_market_rank_market` (`market`) USING BTREE,
KEY `idx_tb_market_rank_list_type` (`list_type`) USING BTREE,
KEY `idx_tb_market_rank_sub_type` (`sub_type`) USING BTREE,
KEY `idx_market_rank_create_time` (`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3065090 DEFAULT CHARSET=utf8mb4 COMMENT='app市场榜单排名表';
CREATE TABLE `tb_xzqh_areas` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(6) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`cityCode` varchar(6) DEFAULT NULL,
`provinceCode` varchar(6) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `udx_areas_code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=10886 DEFAULT CHARSET=utf8 COMMENT='县级(区县)';
CREATE TABLE `tb_search_corp_card` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(6) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`cityCode` varchar(6) DEFAULT NULL,
`provinceCode` varchar(6) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `udx_areas_code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=10886 DEFAULT CHARSET=utf8 COMMENT='县级(区县)';
CREATE TABLE `tb_search_corp_card` (
`ID` bigint(20) NOT NULL,
`CORPID` bigint(20) DEFAULT NULL,
`CORPNAME` varchar(200) NOT NULL,
`REGISTNO` varchar(50) DEFAULT NULL,
`CREDITCODE` varchar(18) DEFAULT NULL,
`REGISTFUND` float(18,6) DEFAULT NULL,
`REGISTADDRESS` varchar(600) DEFAULT NULL
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
文章笔记
1 异常
ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.solr.UncategorizedSolrException: IOException occurred when talking to server at: http://127.0.0.1:8983/solr; nested exception is org.apache.solr.client.solrj.SolrServerException: IOException occurred when talking to server at: http://127.0.0.1:8983/solr] with root cause
org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.
上面做了这么多,做下解释说明:
1.在整合过程中发现如果不需要对solr 进行增,删,改操作,当solr 设置了账号可以直接使用http://zyy:123456@127.0.0.1:8983/solr 连接solr,
可以去掉application bean注入与拦截器SolrAuthInterceptor2.如果设置了账号密码对solr 进行增,删,改操作,应该加上 1上面提得到的方法类,否则会抛出异常1