Solr-6.5.1之Solrj的使用

第一步:添加maven依赖

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.5.1</version>
</dependency>

第二步:书写solr连接类

package solrTest;

import org.apache.solr.client.solrj.impl.HttpSolrClient;

/**
 * 
 * @ClassName: SolrServer
 * @Description: solr连接类
 * @author cheng
 * @date 2017年7月24日 上午9:15:51
 */
public class SolrServer {
    private static HttpSolrClient server = null;
    private static String url = "http://localhost:8080/Solr/db";//其中db为自定义的core名称

    @SuppressWarnings("deprecation")
    public static HttpSolrClient getServer() {
        if (server == null) {
            server = new HttpSolrClient(url);
            server.setDefaultMaxConnectionsPerHost(1000);
            server.setMaxTotalConnections(10000);// 最大连接数
            server.setConnectionTimeout(60000);// 设置连接超时时间(单位毫秒) 1000
            server.setSoTimeout(60000); 设置读数据超时时间(单位毫秒) 1000
            server.setFollowRedirects(false);// 遵循从定向
            server.setAllowCompression(true);// 允许压缩

        }
        return server;
    }

    //测试
    public static void main(String[] args) {
        System.out.println(getServer());
    }
}

第三步:书写原生测试类

package solrTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrQuery.SortClause;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
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.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.junit.Test;

import com.ahutshop.entity.GoodsType;

/**
 * 
 * @ClassName: SolrTest
 * @Description:测试
 * @author cheng
 * @date 2017年7月24日 上午9:16:58
 */
public class SolrTest {

    /**
     * 添加/修改 索引
     * @throws Exception
     */
    public static void addIndex() throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("typeId", UUID.randomUUID().toString().replace("-", ""));
        // 修改相同id的信息
        // doc.addField("typeId", "e0e2283932194628b6a5eee9c263c533");
        doc.addField("typeName", "测试测试测试多个测试");
        doc.addField("createTime", new Date());
        doc.addField("updateTime", new Date());
        server.add(doc);
        server.commit();
    }

    /**
     * 删除索引 按id
     * @throws Exception
     */
    public static void deleteById() throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        server.deleteById("48815aa736da482dbb47e1eed06cc68a");// 按id删除
        server.commit();
    }

    /**
     * 查询所有索引
     * @throws Exception
     */
    public static void query() throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        SolrQuery query = new SolrQuery();
        query.setQuery("*:*");
        query.setStart(0);// 开始记录数
        query.setRows(10000);// 总条数
        QueryResponse queryResponse = server.query(query);
        SolrDocumentList results = queryResponse.getResults();
        System.out.println("总条数为:" + results.getNumFound());
        for (int i = 0; i < results.size(); i++) {
            System.out.println(results.get(i).getFieldNames());
            for (String name : results.get(i).getFieldNames()) {
                System.out.println(results.get(i).getFieldValue(name));
            }
        }
    }

}

第四步:创建javabean

package com.ahutshop.entity;

import java.io.Serializable;
import java.util.Date;

import org.apache.solr.client.solrj.beans.Field;

/**
 * 
 * @ClassName: GoodsType
 * @Description: 商品类型实体类
 * @author cheng
 * @date 2017年7月12日 下午5:37:33
 */
public class GoodsType implements Serializable{
    private static final long serialVersionUID = -4039634130866820668L;

    @Field
    private String typeId;//类型id
    @Field
    private String typeName;//类型名称
    @Field
    private Date createTime;//创建时间
    @Field
    private Date updateTime;//更新时间

    /**
     * 重写tostring
     */
    @Override
    public String toString() {
        return "GoodsType [typeId=" + typeId + ", typeName=" + typeName + ", createTime=" + createTime + ", updateTime="
                + updateTime + "]";
    }

    /**
     * 无参构造函数
     */
    public GoodsType() {
        super();
    }

    /**
     * 有参构造函数
     * @param typeId
     * @param typeName
     * @param createTime
     * @param updateTime
     */
    public GoodsType(String typeId, String typeName, Date createTime, Date updateTime) {
        super();
        this.typeId = typeId;
        this.typeName = typeName;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }
    public String getTypeId() {
        return typeId;
    }
    public void setTypeId(String typeId) {
        this.typeId = typeId;
    }
    public String getTypeName() {
        return typeName;
    }
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

}

第五步:使用SolrBean进行增删改查

public class SolrBean {
    /**
     * 按Bean 添加/修改 索引
     * @throws Exception
     */
    public static void addIndex1() throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        // 添加
        //id如果重复则为修改
        GoodsType type = new GoodsType(UUID.randomUUID().toString().replace("-", ""), "交通工具测试", new Date(), new Date());
        server.addBean(type);
        server.commit();
    }

    /**
     * 删除索引 按查询
     * @throws Exception
     */
    public static void deleteByQuery(String query) throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        query = "*:*";
        server.deleteByQuery(query);
        server.commit();
    }

    // 查询索引
    public static void query1() throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        SolrQuery query = new SolrQuery();
        query.setQuery("*:*");
        query.setStart(0);// 开始记录数
        query.setRows(10000);// 总条数
        QueryResponse queryResponse = server.query(query);
        List<GoodsType> results = queryResponse.getBeans(GoodsType.class);
        System.out.println("总条数为:" + results.size());
        for (GoodsType testBean : results) {
            System.out.println(testBean.toString());
        }   
    }

}

第六步:solrj复杂查询

// 查询索引
    public static void query1() throws Exception {
        HttpSolrClient server = SolrServer.getServer();
        SolrQuery query = new SolrQuery();
        /*
         * 1、常用 q :查询字符串,这个是必须的。如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京)
         * 注意:AND要大写 否则会被当做默认OR
         */
        //query.setQuery("*:*");

        /*
         * fq : (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,
         * 例如:q=查询全部&fq=只要title得值为:xxxx
         */
        //query.setFilterQueries("typeName:测试");

        /*
         * fl : 指定返回那些字段内容,用逗号或空格分隔多个。
         */
        // query.setFields("typeId,typeName");

        /*
         * sort : 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]…
         * 。 示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默认是相关性降序。
         */
        SortClause sort1 = new SortClause("createTime", ORDER.asc);
        SortClause sort2 = new SortClause("updateTime", ORDER.desc);
        List<SortClause> sortList = new ArrayList<SortClause>();
        sortList.add(sort1);
        sortList.add(sort2);
        // query.setSort("createTime", ORDER.asc);
        query.setSorts(sortList);

        query.setQuery("typeName:测试"); // 设置查询关键字
        query.setHighlight(true); // 开启高亮
        query.addHighlightField("typeName"); // 高亮字段
        query.setHighlightSimplePre("<font color='red'>"); // 高亮单词的前缀
        query.setHighlightSimplePost("</font>"); // 高亮单词的后缀


        query.setStart(0);// 开始记录数
        query.setRows(10000);// 总条数

        // QueryResponse queryResponse = server.query(query);
        // List<GoodsType> results = queryResponse.getBeans(GoodsType.class);
        // System.out.println("总条数为:" + results.size());
        // for (GoodsType testBean : results) {
        // System.out.println(testBean.toString());
        // }

        QueryResponse queryResponse = server.query(query);
        List<GoodsType> results = queryResponse.getBeans(GoodsType.class);
        int index = 0;
        // 返回所有的结果...
        SolrDocumentList documentList = queryResponse.getResults();
        Map<String, Map<String, List<String>>> maplist = queryResponse.getHighlighting();
        System.out.println(documentList);
        System.out.println(maplist);

        for(SolrDocument document : documentList){
            String typeId = (String) document.getFieldValue("typeId");
            String typeName = maplist.get(typeId).get("typeName").get(0);
            results.get(index).setTypeName(typeName);
            index++;
        }

        for(GoodsType type : results){
            System.out.println(type);
        }

    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值