solr的客户端操作:使用solrj进行curd操作

导入相关的jar包

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>4.10.2</version>
</dependency>
<!--日志的包, solrj执行需要一个日志包-->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging-api</artifactId>
    <version>1.1</version>
</dependency>

增删改的操作:

package com.zy.solr;

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BaseSolr {

    //solrj写入一个索引
    @Test
    public void createIndexToSolr() throws IOException, SolrServerException {
        //solrj的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //添加document文档
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id", 1);
        document.addField("title", "solr是一个企业级的搜索应用服务器");
        document.addField("content", "solr是一个独立的企业级搜索应用服务器, 用户可以通过http请求访问这个服务器, 获取或者写入对应的内容, 其底层是Lucene");
        solrServer.add(document);
        //提交
        solrServer.commit();
    }

    //solrj写入多个索引
    @Test
    public void createMultiIndexToSolr() throws IOException, SolrServerException {
        //solrj的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //添加document文档
        List<SolrInputDocument> list = new ArrayList<SolrInputDocument>();
        for (int i = 1; i < 6; i++) {
            SolrInputDocument document = new SolrInputDocument();
            document.addField("id", i);
            document.addField("title", "solr是一个企业级的搜索应用服务器 " + i);
            document.addField("content", "solr是一个独立的企业级搜索应用服务器, 用户可以通过http请求访问这个服务器, 获取或者写入对应的内容, 其底层是Lucene " + i);
            list.add(document);
        }

        solrServer.add(list);
        //提交
        solrServer.commit();
    }

    //solrj写入一个索引(使用JavaBean方式)
    @Test
    public void createIndexJavaBeanToSolr() throws IOException, SolrServerException {
        //solrj的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //添加JavaBean信息
        TestBean bean = new TestBean();
        bean.setId("6");
        bean.setName("solr");
        bean.setTitle("solr title");
        bean.setContent("solr content");
        solrServer.addBean(bean);
        //提交
        solrServer.commit();
    }

    //solrj写入多个索引(使用JavaBean方式)
    @Test
    public void createMultiIndexJavaBeanToSolr() throws IOException, SolrServerException {
        //solrj的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //添加JavaBean信息
        List<TestBean> list = new ArrayList<TestBean>();
        for (int i = 7; i < 10; i++) {
            TestBean bean = new TestBean();
            bean.setId(i + "");
            bean.setName("solr " + i);
            bean.setTitle("solr title " + i);
            bean.setContent("solr content " + i);
            list.add(bean);
        }
        solrServer.addBeans(list);
        //提交
        solrServer.commit();
    }

    //solrj进行删除操作
    @Test
    public void deleteIndexToSolr() throws IOException, SolrServerException {
        //solrj的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //执行删除操作
        //根据id删除
        solrServer.deleteById("9");
        //根据条件删除  条件基本格式:  字段的名称:字段的值
        solrServer.deleteByQuery("content:solr content 8");
        //提交
        solrServer.commit();
    }
}

查询操作:

    //基础查询 返回原生document
    @Test
    public void baseQuery() throws SolrServerException {
        //创建solr的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //执行查询操作
        SolrQuery query = new SolrQuery("*:*");
        QueryResponse response = solrServer.query(query);
        SolrDocumentList documents = response.getResults();
        for (SolrDocument document : documents) {
            Object id = document.get("id");
            Object name = document.get("name");
            Object title = document.get("title");
            Object content = document.get("content");
            System.out.println(id + " " + name + " " + title + " " + content);
        }
    }

    //基础查询 返回JavaBean
    @Test
    public void javaBeanQuery() throws SolrServerException {
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        SolrQuery query = new SolrQuery("*:*");
        QueryResponse response = solrServer.query(query);
        List<TestBean> list = response.getBeans(TestBean.class);
        for (TestBean bean : list) {
            System.out.println(bean);
        }
    }

    //复杂查询*********************************************************

    //公共方法
    public void baseToSolr(SolrQuery solrQuery) throws SolrServerException {
        //创建solr的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //执行查询操作
        QueryResponse response = solrServer.query(solrQuery);
        //返回JavaBean list
        List<TestBean> list = response.getBeans(TestBean.class);
        for (TestBean bean : list) {
            System.out.println(bean);
        }
    }

    // 在solr中, 如果要使用模糊查询 需要使用一个符号  ~
    //~ 默认最大的编辑2次
    //注意: 如果搜索条件中包含了特殊符号, 需要在条件的两边添加双引号或者单引号
    @Test
    public void fuzzQueryToSolr() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery("content:'sol~'~");

        baseToSolr(solrQuery);
    }

    //通配符查询
    //?代表一个字符 *代表多个字符
    @Test
    public void wildCardQueryToSolr() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery("content:so*");

        baseToSolr(solrQuery);
    }

    //solr范围查询:  数值范围   日期范围   文本范围(采用字典顺序)
    //使用格式:   [ start TO end ]  包含边界值
    //建议关键字都为大写(跟查询条件的内容进行区分)
    //1 2 3 4 5 6 7 8 10 11  22  33
    @Test
    public void rangeQueryToSolr() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery("id:[1 TO 3]");

        baseToSolr(solrQuery);
    }

    //布尔查询: lucene中: MUST NOT SHOULD
    // solr: AND NOT  OR
    @Test
    public void booleanQueryToSolr() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery("content:企业级 NOT name:solr");

        baseToSolr(solrQuery);
    }

    // 子表达式查询
    // 格式: (条件1 [OR AND  NOT] 条件2) [OR AND  NOT] (条件1 [OR AND  NOT] 条件2)
    @Test
    public void biaoDaShiQueryToSolr() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery("(content:lucene OR name:solr) AND id:[1 TO 2]");

        baseToSolr(solrQuery);
    }

其他高级操作:(排序,分页,高亮)

    //solr排序
    @Test
    public void sortQueryToSolr() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery("*:*");
        solrQuery.setSort(new SolrQuery.SortClause("id", "desc"));
        // 参数1  默认排序的字段   参数2 排序的方式
        solrQuery.setSort("id", SolrQuery.ORDER.desc);
        baseToSolr(solrQuery);
    }

    //solr分页
    @Test
    public void limitQueryToSolr() throws SolrServerException {
        int page = 3; //当前页
        int pageSize = 3; //每页显示的条数
        SolrQuery solrQuery = new SolrQuery("*:*");

        //设置从第几条开始 每页几条
        solrQuery.setStart((page - 1) * pageSize);
        solrQuery.setRows(pageSize);

        solrQuery.setSort(new SolrQuery.SortClause("id", "desc"));
        // 参数1  默认排序的字段   参数2 排序的方式
        solrQuery.setSort("id", SolrQuery.ORDER.desc);
        baseToSolr(solrQuery);
    }

    //solr高亮
    @Test
    public void highlighterQueryToSolr() throws SolrServerException {
        //1. 创建solrj的服务对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //2. 执行查询
        SolrQuery solrQuery = new SolrQuery("content:solr");
        //高亮参数的设置
        solrQuery.setHighlight(true);//开启高亮
        solrQuery.addHighlightField("content");//设置高亮的字段,支持添加多个
        solrQuery.addHighlightField("title");
        solrQuery.setHighlightSimplePre("<font color='red'>"); //设置高亮标签的前缀
        solrQuery.setHighlightSimplePost("</font>"); //设置高亮的后缀
        //solrQuery.setHighlightSnippets(1); //进行分片高亮 默认为1,  主要针对多值的情况

        QueryResponse response = solrServer.query(solrQuery);

        //获取高亮的内容:
        Map<String, Map<String, List<String>>> map = response.getHighlighting();//获取高亮的结果集
        /**
         * 最外层的map:
         *      key: 文档的id值
         *
         * 内层的map
         *      key: 高亮的字段
         * 内层中list:
         *      存放的就是高亮的内容,默认集合中只有一个
         *
         */
        for (String docId : map.keySet()) {
            //System.out.println(docId);
            Map<String, List<String>> listMap = map.get(docId);

            for (String highlighterField : listMap.keySet()) {
                //System.out.println(highlighterField);
                List<String> list = listMap.get(highlighterField);//获取到高亮的内容
                System.out.println("集合的长度:" + list.size());
                System.out.println(highlighterField + "   " + list.get(0));
            }
        }
    }
原文地址:https://www.cnblogs.com/blazeZzz/p/9430718.html