springboot整合solr,solr设置登录用户密码连接

简介:该文章会介绍solr整合springboot,操作api 使用两种方式,SolrClient,SolrTemplate 两种方式基本使用方法与对比。其实大家学习完后会发现SolrTemplate 通过代理工厂模式对SolrClient 逻辑封装一层,感兴趣的朋友可以往下点开看源码看看,这里不做详细点缀。

首先需要安装solr 并且配置相应的账号密码

可以参考前写的文章:

Sorl环境搭建与mysql表导入数据
solr配置账号权限登录

目录结构介绍在这里插入图片描述

目录介绍:

annotation 注解目录
bean bean对象
controller 控制层
fiter 拦截器
resourcess 配置文件信息

代码

  1. application.yml配置文件
spring:
  data:
    solr:
      host: http://127.0.0.1:8983/solr
      user: zyy
      pwd: 123456
  1. 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();
    }
}

  1. 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);
        }
    }
}
  1. 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());
    }
}

  1. 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;


}

  1. annotation 过滤器
package com.zyy.test.annotation;


import java.lang.annotation.*;

/**
 * 过滤字段参与where查询
 *
 * @author zhaoyy
 */
@Documented
@Target({
    
    ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FilterName {
    
    
}

  1. 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:[email protected]:8983/solr 连接solr,
可以去掉application bean注入与拦截器SolrAuthInterceptor

2.如果设置了账号密码对solr 进行增,删,改操作,应该加上 1上面提得到的方法类,否则会抛出异常1

猜你喜欢

转载自blog.csdn.net/weixin_43829047/article/details/126478885