Solr的服务器环境:
1) apache-tomcat-8.5.32-windows-x86.zip
2) solr-5.5.0.zip
3) jdk-7u80-windows-i586.exe
引入SolrJ的依赖包:
在加上一个commons-logging-1.1.1.jar的日志依赖包
链接:https://pan.baidu.com/s/1RygDMgbaAV1mKyxq0QPA5w 提取码:njor
例1: 向solr的索引库中添加索引文档
测试代码:
package cn.tx.demo;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;
public class SolrJDemo {
@Before
public void setUp() throws Exception {
}
/**
* 向solr索引库中添加索引文档
*/
@Test
public void addDoc() {
//创建solr的客户端对象
HttpSolrClient client = new HttpSolrClient("http://localhost:8080/solr/core");
//创建一个solr的文档对象
SolrInputDocument sd = new SolrInputDocument();
sd.addField("id", "c0001");
sd.addField("product_name", "Solr学习");
sd.addField("product_catalog_name", "IT技术");
sd.addField("product_description", "SolrJ是访问Java服务的Solr客户端");
sd.addField("product_price", 299);
sd.addField("product_picture", "xxx.jpg");
try {
//把文档加入服务器
client.add(sd);
//提交
client.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
例2: 删除文档
测试代码:
/**
* 根据id删除文档
*/
@Test
public void delDocById() throws Exception {
HttpSolrClient client = new HttpSolrClient("http://localhost:8080/solr/core");
client.deleteById("c0001");
client.commit();
}
/**
* 根据查询条件删除文档
*/
@Test
public void delDocByQuery() throws Exception {
HttpSolrClient client = new HttpSolrClient("http://localhost:8080/solr/core");
client.deleteByQuery("product_name:青蛙");
client.commit();
}
例3: 文档查询
测试代码:
/**
* 查询文档
*/
@Test
public void queryDoc() throws Exception {
HttpSolrClient client = new HttpSolrClient("http://localhost:8080/solr/core");
//创建文档查询对象
SolrQuery sq = new SolrQuery();
//设置查询条件
sq.set("q", "product_name:浪漫樱花");
//设置过滤条件
sq.set("fq", "product_price:[50 TO 100]");
//设置排序
sq.addSort("product_price", ORDER.asc);
//设置分页查询条件
//设置开始行号
sq.setStart(0);
//设置每页记录数
sq.setRows(10);
QueryResponse query = client.query(sq);
SolrDocumentList results = query.getResults();
long numFound = results.getNumFound();
System.out.println("记录数: "+numFound);
//遍历
for(SolrDocument sd: results){
String id = (String) sd.getFieldValue("id");
String product_name = (String) sd.getFieldValue("product_name");
String product_catalog_name = (String) sd.getFieldValue("product_catalog_name");
String product_description = (String) sd.getFieldValue("product_description");
String product_picture = (String) sd.getFieldValue("product_picture");
Double product_price = (Double) sd.getFieldValue("product_price");
System.out.println("------------------------");
System.out.println("商品id: "+id);
System.out.println("商品名称: "+product_name);
System.out.println("商品品牌: "+product_catalog_name);
System.out.println("商品图片: "+product_picture);
System.out.println("商品单价: "+product_price);
}
}
例4: 高亮查询
高亮的结构如下图:
测试代码:
/**
* 高亮查询
*/
@Test
public void queryHLDoc() throws Exception {
HttpSolrClient client = new HttpSolrClient("http://localhost:8080/solr/core");
//创建文档查询对象
SolrQuery sq = new SolrQuery();
//设置查询条件
sq.set("q", "product_name:时尚 AND product_catalog_name:时尚");
//开启高亮
sq.setHighlight(true);
sq.addHighlightField("product_name");
sq.addHighlightField("product_catalog_name");
sq.setHighlightSimplePre("<b>");
sq.setHighlightSimplePost("</b>");
QueryResponse query = client.query(sq);
SolrDocumentList results = query.getResults();
long numFound = results.getNumFound();
System.out.println("记录数: "+numFound);
//遍历
for(SolrDocument sd: results){
String id = (String) sd.getFieldValue("id");
String product_name = (String) sd.getFieldValue("product_name");
String product_catalog_name = (String) sd.getFieldValue("product_catalog_name");
String product_picture = (String) sd.getFieldValue("product_picture");
Double product_price = (Double) sd.getFieldValue("product_price");
System.out.println("------------------------");
System.out.println("商品id: "+id);
System.out.println("商品名称: "+product_name);
System.out.println("商品品牌: "+product_catalog_name);
System.out.println("商品图片: "+product_picture);
System.out.println("商品单价: "+product_price);
//获取高亮区域的结构体
Map<String, Map<String, List<String>>> HLMap = query.getHighlighting();
if(HLMap != null){
//根据id获取每一个域的高亮内容
Map<String, List<String>> map = HLMap.get(id);
//根据具体的域获取高亮内容
List<String> contentList1 = map.get("product_name");
if(contentList1.size() > 0 && contentList1 != null){
//输出高亮内容
for(String content1: contentList1){
System.out.println("高亮内容product_name: "+content1);
}
}
List<String> contentList2 = map.get("product_catalog_name");
if(contentList2.size() > 0 && contentList2 != null){
//输出高亮内容
for(String content2: contentList2){
System.out.println("高亮内容product_catalog_name: "+content2);
}
}
}
}
}