一、Solr的添加

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();
    }
}