一、在solr中插入数据
{
"id": 536563,
"tb_item_cid": 560,
"tb_item_cname": "手机",
"tb_item_title": "new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待",
"tb_item_sell_point": "清仓!仅北京,武汉仓有货!"
}
在solr中插入的数据,这些数据的字段都需要在solr中进行“注册”,被“注册”过的字段,就可以支持分词,因此这些数据就可以被查询。
1.在solr中“注册”字段
1)搜索出来以后的数据是什么样的,这样的数据才会存入到solr中
搜索出来的数据主需要有部分字段,
因此,通过设计一个专门用于存放solr中的数据的模型(javabean),来先获取这样的所有的数据,然后再存到solr里。
2)设计javabean
商品id
商品名称
商品实际售价
商品图片
商品描述
3)根据javabean中的属性设计sql语句
SELECT
a.pid as id,
a.pname as t_product_name,
a.sale_price as t_product_sale_price,
a.pimage as t_product_pimage,
b.pdesc as t_product_pdesc
FROM
t_product a
LEFT JOIN t_product_desc b
ON a.pid = b.pid
4)在solr中注册字段
编辑ik配置文件: managed_schema
让配置文件在容器中生效
复制到容器
docker cp managed-schema solr:/opt/solr/server/solr/ik_core/conf
重启容器
docker-compose restart
5)在solr的浏览器客户端中插入数据
6)查询数据
7)删除数据
根据查询结果删除
根据id来删除
二、在springboot中使用solr实现增删改查
1.添加依赖
org.springframework.boot
spring-boot-starter-data-solr
yml:
spring:
data:
solr:
host: http://192.168.2.143:8983/solr/ik_core
2.编写javabean
3.往solr中插入数据
@Autowired
private TProductSearchDTOMapper mapper;
@Autowired
private SolrClient solrClient;
//将数据库中获取的数据,插入到solr库中
@Test
public void insertDataToSolr() throws IOException, SolrServerException {
//1.获取数据库中的数据
List products = mapper.selectAll();
//2.将数据插入到solr
//用于存放所有solr数据的集合
List documents = new ArrayList<>();
//封装Document对象
for (TProductSearchDTO product : products) {
SolrInputDocument document = new SolrInputDocument();
document.addField("id",product.getId());
document.addField("t_product_name",product.gettProductName());
document.addField("t_product_sale_price",product.gettProductSalePrice().floatValue());
document.addField("t_product_pimage",product.gettProductPimage());
document.addField("t_product_pdesc",product.gettProductPdesc());
//存入到集合中
documents.add(document);
}
//提交给solr客户端
solrClient.add(documents);
//commit
solrClient.commit();
}
4.在solr中查询数据
1)普通的查询并封装
@Autowired
private SolrClient solrClient;
//查询solr库
@Test
public void testQueryFromSolr() throws IOException, SolrServerException {
// String keyword = "t_product_name:手机"; //指定字段查询
//复制域查询
String keyword = "手机";
//创建查询对象
SolrQuery query = new SolrQuery();
//往对象中设置参数
query.set("df","t_product_keywords");//复制域查询
query.setQuery(keyword);
query.setStart(0);
query.setRows(10);
//高亮
query.addHighlightField("t_product_name");
query.setHighlight(true);
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
//执行查询.得到响应结果
QueryResponse response = solrClient.query(query);
// System.out.println(response);
//封装结果集==> List
List products = new ArrayList<>();
SolrDocumentList results = response.getResults();
for (SolrDocument document : results) {
TProductSearchDTO product = new TProductSearchDTO();
Long id = Long.parseLong((String) document.getFieldValue("id"));
product.setId(id);
String t_product_name = (String) document.getFieldValue("t_product_name");
product.settProductName(t_product_name);
Float t_product_sale_price = (Float) document.getFieldValue("t_product_sale_price");
product.settProductSalePrice(new BigDecimal(t_product_sale_price));
String t_product_pimage = (String) document.getFieldValue("t_product_pimage");
product.settProductPimage(t_product_pimage);
String t_product_pdesc = (String) document.getFieldValue("t_product_pdesc");
product.settProductPdesc(t_product_pdesc);
products.add(product);
}
System.out.println(products);
}
2)带高亮的查询并封装
@Autowired
private SolrClient solrClient;
//查询solr库
@Test
public void testQueryFromSolr() throws IOException, SolrServerException {
// String keyword = "t_product_name:手机"; //指定字段查询
//复制域查询
String keyword = "手机";
//创建查询对象
SolrQuery query = new SolrQuery();
//往对象中设置参数
query.set("df","t_product_keywords");//复制域查询
query.setQuery(keyword);
query.setStart(0);
query.setRows(10);
//高亮
query.addHighlightField("t_product_name");
query.setHighlight(true);
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
//执行查询.得到响应结果
QueryResponse response = solrClient.query(query);
// System.out.println(response);
//封装结果集==> List
List products = new ArrayList<>();
//获得数据结果集
SolrDocumentList results = response.getResults();
//获得高亮结果集
Map>> highlighting = response.getHighlighting();
for (SolrDocument document : results) {
TProductSearchDTO product = new TProductSearchDTO();
String stringId = (String) document.getFieldValue("id");
Long id = Long.parseLong(stringId );//89983
product.setId(id);
//==========从高亮结果集中那带高亮效果的t_product_name=============
Map> stringListMap = highlighting.get(stringId);
List t_product_name1 = stringListMap.get("t_product_name");
String t_product_name = t_product_name1.get(0);
product.settProductName(t_product_name);
Float t_product_sale_price = (Float) document.getFieldValue("t_product_sale_price");
product.settProductSalePrice(new BigDecimal(t_product_sale_price));
String t_product_pimage = (String) document.getFieldValue("t_product_pimage");
product.settProductPimage(t_product_pimage);
String t_product_pdesc = (String) document.getFieldValue("t_product_pdesc");
product.settProductPdesc(t_product_pdesc);
products.add(product);
}
System.out.println(products);
}
5.在solr中删除数据