我们使用solrj来操作solr服务,一般习惯先建一个测试类测试下增删改查方法是否好使,这样可以大大减少出错概率,提升开发效率。
我们的taotao-search-service工程还没有添加对solrj的依赖,因此需要先添加对solrj的依赖,在taotao-search-service工程的pom.xml文件当中添加如下依赖(之所以不用写版本号是因为在taotao-parent工程已经统一定义版本号了)
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
下面我们新建一个测试类TestSolrJ,如下图所示。先测试添加文档操作。注意:参加的字段必须是schema.xml中定义的。
package com.taotao.solrj;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
public class TestSolrJ {
@Test
public void testAddDocument() throws Exception{
//创建一个SolrServer对象,创建一个HttpSolrServer对象,需要指定solr服务的url
//如果有多个collection则需要指定要操作哪个collection,如果只有一个,可以不指定
SolrServer solrServer = new HttpSolrServer("http://192.168.117.106:8080/solr/collection1");
//创建一个文档对象SolrInputDocument
SolrInputDocument document = new SolrInputDocument();
//向文档中添加域,必须有id域,域的名称必须在schema.xml中定义
document.addField("id", "1111");
document.addField("item_title", "海尔空调");
document.addField("item_sell_point", "送电暖宝一个哦");
document.addField("item_price", 10000);
document.addField("item_image", "http://www.123.jpg");
document.addField("item_category_name", "电器");
document.addField("item_desc", "这是一款最新的空调,质量好,值得信赖!!");
//将document添加到索引库
solrServer.add(document);
//提交
solrServer.commit();
}
}
执行上面的方法,成功后,我们到Solr首页,点击"Execute Query"按钮,即可查询到我们刚才添加的文本。
大家发现了没有,在查询出来的数据当中没有item_desc字段,这是因为在schema.xml文件中指定该字段不保存,如下图所示,indexed="true"表示分词存储,可以查询stored="false"表示不存储内容。stored="false"该字段就不会随查询结果一起显示,stored="true"才会显示。
下面我们来测试通过ID删除文档
@Test
public void testDeleteDocument() throws Exception {
// 创建一个SolrServer对象,创建一个HttpSolrServer对象,需要指定solr服务的url
SolrServer solrServer = new HttpSolrServer("http://192.168.117.106:8080/solr/collection1");
// 通过id来删除文档
solrServer.deleteById("1111");
// 提交
solrServer.commit();
}
删除完之后,我们再查询,发现已经没有刚才我们添加的那个文档了,如下图所示。
下面我们再测试另外一种删除方法,由于刚才我们把仅存的一条文档删除了,现在我们再添加两条数据,如下图所示。
通过搜索删除代码如下
@Test
public void deleteDocumentByQuery() throws Exception{
//创建一个SolrServer对象,创建一个HttpSolrServer对象,需要指定solr服务的url
SolrServer solrServer = new HttpSolrServer("http://192.168.117.106:8080/solr/collection1");
//通过价格来删除文档
solrServer.deleteByQuery("item_price:20000");
//提交
solrServer.commit();
}
删除后,我们再查询,发现已经没有价格为2000的那个文档记录了,如下图所示。
至于修改操作其实就是添加操作,ID一样的,新记录会覆盖老记录,从而达到修改的目的
下面我们进行查询操作,如下所示。
@Test
public void queryDocument() throws Exception {
// 创建一个SolrServer对象,创建一个HttpSolrServer对象,需要指定solr服务的url
SolrServer solrServer = new HttpSolrServer("http://192.168.117.106:8080/solr/collection1");
// 通过id来删除文档
SolrQuery query = new SolrQuery();
query.setQuery("id:222");
QueryResponse response = solrServer.query(query);
SolrDocumentList list = response.getResults();
for (SolrDocument document : list) {
String id = document.getFieldValue("id").toString();
String title = document.getFieldValue("item_title").toString();
System.out.println(id);
System.out.println(title);
}
}