前言
经过前面的学习,我们知道了solr 基本配置和概念,下面看看java 里边是怎么实现的,在这个之前,要先把我们的solr服务开启。
引入jar包
我在springboot 项目里测试的,所有只需要引入一个 starter组件就可以了,里边已经包含了solrJ
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
上代码
package com.example.demo.service;
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.impl.HttpSolrClient;
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 java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Administrator on 2019/10/10.
*/
public class SolrTest {
public static void main(String[] args) {
try {
// new SolrTest().addDocument();
// new SolrTest().delete();
// new SolrTest().simpleQuery(); // 简单查询
new SolrTest().hardQuery(); // 复杂查询
} catch (Exception e) {
e.printStackTrace();
}
}
public void addDocument() throws Exception {
String solrUrl = "http://localhost:8983/solr/";
// 1 通过 HttpSolrClient 建立连接,老的版本是 HttpSolrServer对象
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
// 2、 创建SolrInputDocument对象,然后通过它来添加域。
SolrInputDocument document = new SolrInputDocument();
// 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
// 第二个参数:域的值
// 注意:id的域不能少
document.addField("id", "c0001");
document.addField("s_name", "赵四");
document.addField("s_address", "上海市宝山区");
// 3、 将document添加到索引库。
client.add("collection",document);
// 4、 提交。
client.commit("collection");
// 注意: 由于我们建立连接的是时候没有 指定实例名称,所以 add 和commit 的时候要指定,不然会报错
}
public void delete(){
String solrUrl = "http://localhost:8983/solr/collection";
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
try {
// 写法很多,可以百度下
// client.deleteById("c0002");
client.deleteByQuery("id:c0003");
client.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void simpleQuery(){
String solrUrl = "http://localhost:8983/solr/collection";
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
System.out.println(client);
try {
// 创建SolrQuery对象
SolrQuery query = new SolrQuery();
query.set("q","*:*"); // 查询所有的
QueryResponse response = client.query(query);
SolrDocumentList solrDocuments = response.getResults();
long count = solrDocuments.getNumFound();
System.out.println("count is "+count);
for (SolrDocument document: solrDocuments) {
System.out.println(document.get("id"));
System.out.println(document.get("s_name"));
System.out.println(document.get("s_address"));
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void hardQuery(){
String solrUrl = "http://localhost:8983/solr/collection2";
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
System.out.println(client);
try {
// 创建SolrQuery对象
SolrQuery query = new SolrQuery();
query.set("q","花儿"); // 设定搜索条件 q
query.setFilterQueries("p_catalog_name:与钟不同"); // fq: 过滤条件
query.setSort("id", SolrQuery.ORDER.asc); // sort: 设置排序
query.setStart(0);
query.setRows(10); // 分页,每页10 条
query.setFields("id","p_name","p_catalog","p_catalog_name");// 显示的字段
query.set("df","p_name"); // 设置默认搜索域
query.setHighlight(true); // 设置开启高亮
query.addHighlightField("p_name");
query.setHighlightSimplePre("<span color='red'>");
query.setHighlightSimplePost("</spam>"); // 高亮的格式,和页面的基本是一样的
// 查询索引库
QueryResponse response = client.query(query);
SolrDocumentList solrDocuments = response.getResults();
// 得到高亮部分的集合
Map<String,Map<String,List<String>>> hightingMap = response.getHighlighting();
long count = solrDocuments.getNumFound();
System.out.println("count is "+count);
for (SolrDocument document: solrDocuments) {
String id = document.get("id").toString();
String productName = document.get("p_name").toString();
String catalog = document.get("p_catalog").toString();
String catalogName = document.get("p_catalog_name").toString();
List<String> list = hightingMap.get(id).get("p_name");
if(list!=null){
productName = list.get(0); // 如果有高亮信息,把高亮的值赋给 产品名称
}
System.out.println("id="+id+", p_name="+productName+", p_catalog="+catalog+", p_catalog_name="+catalogName);
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}