solr-7.7.3配置详解请看:solr-7.7.3配置详解,并且连接数据库 (一)
1、在application.yml
配置solr
的连接地址:
spring:
data:
solr:
host: http://127.0.0.1:8080/solr/collection1
2、pom
文件添加依赖:
<!--集成solr搜索引擎客户端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.4.0</version>
</dependency>
<!--如果项目需要用HttpClient,版本要4.5.10以上的-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
java
代码:
package com.example.demo.controller;
import com.example.demo.Entity.ShopProductEntity;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
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.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.apache.solr.client.solrj.SolrClient;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RequestMapping("solr")
@RestController
public class SolrController {
@Autowired
private SolrClient client;
/**
* @param:
* @return:
* @Date: 2021/2/9
* @author:liuyu 新增/修改 索引 * 当 id 存在的时候, 此方法是修改, 如果 id 不存在, 则是新增
* 如果spring.data.solr.host 里面配置到 core了, 那么这里就不需要传 collection1 这个参数
* 下面都是一样的
*/
@PostMapping("add")
public String add(ShopProductEntity moduleInfo) {
try {
if (StringUtils.isEmpty(moduleInfo.getId()) {
throw new Exception("id为空");
}
//ShopProductEntity moduleInfo = new ShopProductEntity();
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", moduleInfo.getId());
doc.addField("pro_ode", moduleInfo.getProCode());
doc.addField("pro_name", moduleInfo.getProName());
//solrCore 是core 比如这边是collection1,当然这边地址有配置core了,就不需要这句话了
// client.add(solrCore,doc);
client.add(doc);
client.commit();
return "success";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
/**
* @param:
* @return:
* @Date: 2021/2/9
* @author:liuyu 根据id删除索引
*/
@PostMapping("delete")
public String delete(String id) {
try {
//solrCore 是core 比如这边是collection1,当然这边地址有配置core了,就不需要这句话了
// client.add(solrCore,doc);
client.deleteById(id);
client.commit();
return "success";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
/**
* @param:
* @return:
* @Date: 2021/2/9
* @author:liuyu 删除所有的索引
*/
@PostMapping("deleteAll")
public String deleteAll() {
try {
//solrCore 是core 比如这边是collection1,当然这边地址有配置core了,就不需要这句话了
// client.add(solrCore,doc);
client.deleteByQuery("*:*");
client.commit();
return "success";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
/**
* @param:
* @return:
* @Date: 2021/2/9
* @author:liuyu 根据id查询索引
*/
@PostMapping("getById")
public String getById(String id) throws Exception {
SolrDocument document = client.getById(id);
System.out.println(document);
return document.toString();
}
/**
* 综合查询: 在综合查询中, 有按条件查询, 条件过滤, 排序, 分页, 高亮显示, 获取部分域信息
*/
@PostMapping("search")
public List<Map<String, Object>> search(String proName, String area, String convenientStatus, int pageStart, int pageEnd) {
try {
SolrQuery params = new SolrQuery();
//查询条件,
params.set("q", proName);
//过滤条件
params.addFilterQuery("area:*" + area + "*");//地区
//如果便捷事项为空,则不过滤便捷事项
if (StringUtils.isNotBlank(convenientStatus)) {
params.addFilterQuery("convenientStatus:*" + convenientStatus + "*");//便捷事项
}
//
params.addFilterQuery("types:2");//(0:公共,1:定制化)
//排序
// params.addSort("product_price", SolrQuery.ORDER.asc);
//分页,第一条乘以数量等于第几页
params.setStart(pageStart * pageEnd);
params.setRows(pageEnd);
//默认域,查询字段
params.set("df", "pro_name");
//只查询指定域
// params.set("fl", "id,product_title,product_price");
//高亮
//打开开关
params.setHighlight(true);
//指定高亮域
params.addHighlightField("pro_name");
//设置前缀
params.setHighlightSimplePre("<span style='color:#28FF28'>");
//设置后缀
params.setHighlightSimplePost("</span>");
QueryResponse queryResponse = client.query(params);
SolrDocumentList results = queryResponse.getResults();
long numFound = results.getNumFound();
System.out.println("输出总条数,跟分页的值无关:"+numFound);
//获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的
Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
List<Map<String, Object>> listData = new ArrayList<>();
for (SolrDocument result : results) {
Map<String, Object> mapData = new HashMap<>();
Map<String, List<String>> map = highlight.get(result.get("id"));
List<String> list = map.get("pro_name");
mapData.put("id", result.get("id"));
mapData.put("proCode", result.get("pro_code"));
mapData.put("proName", list.get(0));
mapData.put("proTypeId", result.get("pro_type_id"));
mapData.put("proImg", result.get("pro_img"));
mapData.put("price", result.get("price"));
listData.add(mapData);
}
return listData;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}