1、solr的配置文件(solr.properties)
solr.Url=http://localhost:8080/solr/student (student是实例core)
solr.maxRetries=1
solr.connectionTimeout=500
2、引入solr的配置文件,并配置bean
<context:property-placeholder location="classpath:/jdbc.properties,classpath:/solr.properties" />
<!--定义solr的server -->
<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg index="0" value="${solr.Url}" />
<!-- 设置响应解析器 -->
<property name="parser">
<bean class="org.apache.solr.client.solrj.impl.XMLResponseParser" />
</property>
<!-- 设置重试次数 -->
<property name="maxRetries" value="${solr.maxRetries}" />
<!-- 建立连接的最长时间 -->
<property name="connectionTimeout" value="${solr.connectionTimeout}" />
</bean>
3、创建学生实体类(注意@Field必须加上)
import org.apache.solr.client.solrj.beans.Field;
public class Student {
private String id;
private String stu_name;
private int age;
private String stu_school;
public String getId() {
return id;
}
@Field
public void setId(String id) {
this.id = id;
}
public String getStu_name() {
return stu_name;
}
@Field
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public int getAge() {
return age;
}
@Field
public void setAge(int age) {
this.age = age;
}
public String getStu_school() {
return stu_school;
}
@Field
public void setStu_school(String stu_school) {
this.stu_school = stu_school;
}
@Override
public String toString() {
return "Student [id=" + id + ", stu_name=" + stu_name + ", age=" + age + ", stu_school=" + stu_school + "]";
}
}
4、编写业务代码
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
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.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jssecco.split.solr.model.Student;
@Controller
@RequestMapping("/solr")
public class SpringSolrController {
@Autowired
private HttpSolrServer httpSolrServer;
/**
* 测试方法
*
* @param id
* @return
* @throws SolrServerException
*/
@ResponseBody
@RequestMapping(value = "/getStudent")
public Student getStudent(Long id) throws SolrServerException {
// 创建查询条件
SolrQuery query = new SolrQuery();
query.setQuery("id:" + id);
// 查询并返回结果
QueryResponse queryResponse = this.httpSolrServer.query(query);
return (Student) queryResponse.getBeans(Student.class);
}
/**
* 新增、修改
*
* @param student
* @throws SolrServerException
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/addStudent")
public void addStudent(@RequestBody Student student) throws SolrServerException, IOException {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", student.getId());
doc.addField("stu_name", student.getStu_name());
doc.addField("age", student.getAge());
doc.addField("stu_school", student.getStu_school());
UpdateResponse response = this.httpSolrServer.add(doc);
this.httpSolrServer.commit(); // 提交
System.out.println(response);
}
/**
* 删除
*
* @param student
* @throws SolrServerException
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/delStudent")
public void delStudent(@RequestBody Student student) throws SolrServerException, IOException {
UpdateResponse response = this.httpSolrServer.deleteById(student.getId());
this.httpSolrServer.commit(); // 提交
System.out.println(response);
}
@ResponseBody
@RequestMapping(value = "/searchStudentList")
public void searchStudentList() throws SolrServerException {
// 相当于QueryParser
SolrQuery query = new SolrQuery("*:*");
query.setStart(1);
query.setRows(3);
QueryResponse res = this.httpSolrServer.query(query);
// 可以直接查询相应的bean对象,但是不是很常用
// 使用这种方式无法获取总数量
List<Student> list = res.getBeans(Student.class);
System.out.println("当前总数:" + list.size());
for (Student stu : list) {
System.out.println(stu.getId() + "#" + stu.getStu_name() + "#" + stu.getAge() + "#" + stu.getStu_school());
}
}
@ResponseBody
@RequestMapping(value = "/testHighlight")
public void testHighlight() throws SolrServerException {
// 以后参数都是通过这个对象去构造...
SolrQuery solrParams = new SolrQuery();
solrParams.setQuery("stu_name:测试");
// 开启高亮
solrParams.setHighlight(true);
// 高亮显示的格式
solrParams.setHighlightSimplePre("<font color='red'>");
solrParams.setHighlightSimplePost("</font>");
// 我需要那几个字段进行高亮
solrParams.setParam("hl.fl", "stu_name");
QueryResponse queryResponse = this.httpSolrServer.query(solrParams);
// 返回所有的结果...
SolrDocumentList documentList = queryResponse.getResults();
Map<String, Map<String, List<String>>> maplist = queryResponse.getHighlighting();
// 返回高亮之后的结果..
for (SolrDocument solrDocument : documentList) {
Object id = solrDocument.get("id");
Map<String, List<String>> fieldMap = maplist.get(id);
List<String> stringlist = fieldMap.get("stu_name");
System.out.println(stringlist);
}
}
}