test01(),test02(),test03()分别对应普通添加,List添加,JavaBean添加。
package com.wsy;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
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.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
public class SolrJTest {
private final static String solrServerUrl = "http://localhost:8080/solr";
private CommonsHttpSolrServer commonsHttpSolrServer = null;
@Before
public void init() {
// 创建SolrServer对象(CommonsHttpSolrServer和EmbeddedSolrServer)
// CommonsHttpSolrServer需要启动web服务器,通过HTTP请求获取数据
// EmbeddedSolrServer是内嵌式的,可以不启动HTTP来获取数据,只需要导入包,指定home目录就可以了,但是底层还是依托于HTTP服务的
try {
commonsHttpSolrServer = new CommonsHttpSolrServer(solrServerUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Test
public void test01() {
try {
// 删除所有数据并提交
// commonsHttpSolrServer.deleteByQuery("*:*");
// commonsHttpSolrServer.commit();
// 添加文档并提交
SolrInputDocument solrInputDocument = new SolrInputDocument();
// 添加Field的时候,这里必须有一个主键id,这里的类型也要是String的
// id是唯一主键,当有相同的id的时候,后面的会把前面的覆盖掉
solrInputDocument.addField("id", "1");
solrInputDocument.addField("msg_title", "这是我的第一个SolrJ的程序");
solrInputDocument.addField("msg_content", "这个程序能不能跑起来呢?");
commonsHttpSolrServer.add(solrInputDocument);
commonsHttpSolrServer.commit();
// 10分钟
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test02() {
try {
// 基于列表来天津爱数据,一次性添加多个数据
List<SolrInputDocument> list = new ArrayList<SolrInputDocument>();
SolrInputDocument solrInputDocument = new SolrInputDocument();
solrInputDocument.addField("id", "2");
solrInputDocument.addField("msg_title", "很好,Solr可以工作了");
solrInputDocument.addField("msg_content", "Solr终于可以工作了");
list.add(solrInputDocument);
solrInputDocument = new SolrInputDocument();
solrInputDocument.addField("id", "3");
solrInputDocument.addField("msg_title", "测试Solr的添加");
solrInputDocument.addField("msg_content", "看看能不能添加列表信息");
list.add(solrInputDocument);
commonsHttpSolrServer.add(list);
commonsHttpSolrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void test03() {
try {
// 基于JavaBean的添加
// 需要在JavaBean里面属性的set方法上注明对应的Field
List<JavaBean> list = new ArrayList<JavaBean>();
list.add(new JavaBean("4", "基于JavaBean的添加", new String[]{"通过JavaBean完成添加", "JavaBean添加附件"}));
list.add(new JavaBean("5", "基于JavaBean的列表数据添加", new String[]{"测试如何通过对象完成添加", "通过对象添加的附件"}));
commonsHttpSolrServer.addBeans(list);
commonsHttpSolrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.wsy;
import org.apache.solr.client.solrj.beans.Field;
public class JavaBean {
private String id;
private String title;
// 这里的content是一个数组,所以在schema.xml中应该对应的Field定义上加上multiValued="true"
private String[] content;
public JavaBean() {
}
public JavaBean(String id, String title, String[] content) {
this.id = id;
this.title = title;
this.content = content;
}
public String getId() {
return id;
}
@Field("id")
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
@Field("msg_title")
public void setTitle(String title) {
this.title = title;
}
public String[] getContent() {
return content;
}
@Field("msg_content")
public void setContent(String[] content) {
this.content = content;
}
}
二、Solr的查询
@Test
public void test04() {
// 基于结果集的查询
try {
SolrQuery solrQuery = new SolrQuery("*");
// 设置分页,从第0条开始,每页显示3条
solrQuery.setStart(0);
solrQuery.setRows(3);
QueryResponse queryResponse = commonsHttpSolrServer.query(solrQuery);
SolrDocumentList solrDocuments = queryResponse.getResults();
System.out.println("总条数:" + solrDocuments.getNumFound());
for (SolrDocument solrDocument : solrDocuments) {
System.out.println(solrDocument);
System.out.println("msg_title:" + solrDocument.getFieldValue("msg_title"));
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
@Test
public void test05() {
// 基于JavaBean的查询
try {
SolrQuery solrQuery = new SolrQuery("*");
// 设置分页,从第0条开始,每页显示3条
solrQuery.setStart(0);
solrQuery.setRows(3);
QueryResponse queryResponse = commonsHttpSolrServer.query(solrQuery);
// 直接将查询结果封装到Bean中,不过不常用,因为没有发看到总条数
List<JavaBean> list = queryResponse.getBeans(JavaBean.class);
// 如果设置了分页,这里的size()不是总数量,而是当前页的数量
System.out.println("当前页的数量是:" + list.size());
for (JavaBean javaBean : list) {
System.out.println(javaBean.getTitle());
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
三、Solr的更新
前面提到,当文档的id相同的时候,后面的值会覆盖前面的值,这就是Solr的更新。
四、Solr的删除使用下面代码删除全部文档,并提交。
commonsHttpSolrServer.deleteByQuery("*:*");
commonsHttpSolrServer.commit();
五、Solr的高亮
@Test
public void test06() {
try {
SolrQuery solrQuery = new SolrQuery("JavaBean");
// 设置高亮,这里支持链式编程
solrQuery.setHighlight(true).setHighlightSimplePre("<span>").setHighlightSimplePost("</span>");
// 设置高亮的区域,这里的hl.fl是highlightField的意思
solrQuery.setParam("hl.fl", "msg_title,msg_content");
QueryResponse queryResponse = commonsHttpSolrServer.query(solrQuery);
SolrDocumentList solrDocuments = queryResponse.getResults();
System.out.println("总条数:" + solrDocuments.getNumFound());
for (SolrDocument solrDocument : solrDocuments) {
String id = solrDocument.getFieldValue("id").toString();
// 获取高亮的域,前提是这个域是store="true"的,否则是无法获取高亮的信息
System.out.println(queryResponse.getHighlighting().get(id).get("msg_title"));
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}