java操作solr,双core关联查询

笔记记录,核心代码解释参见代码注释

package com.wang.solr.utils;

import org.apache.solr.client.solrj.SolrQuery;
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;

/**
 * @author Monk
 */
public class SolrUtils {

    private static final String instanceQueryUrl = "http://192.168.94.123:8983/solr/esbinstance";
    public static void main(String[] args) {
        queryDoubleCore();
    }

    /**
     * 双core查询
     */
    private static void queryDoubleCore(){
        // 此处的URL很关键,决定了最终的查询结果源自哪个core
        HttpSolrClient client = new HttpSolrClient.Builder(instanceQueryUrl).build();

        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setSort("CREATED_DATE", SolrQuery.ORDER.asc);
        solrQuery.setStart(0);
        solrQuery.setRows(20);
        solrQuery.setFilterQueries("CREATED_DATE:[2020-02-10T16:00:00Z TO *] && SERVICE_NAME:*OSB_EIP_EIP_HQ_Import*");
        /**
         * 构建HttpSolrClient时的core就是最终查询结果对应的core,简称core_url
         * 大括号内的关键字含义:
         *      !join : 双core连接查询的关键字
         *      fromIndex : 要关联查询的core,简称core_a
         *      toIndex : 本身查询的core,简称core_b
         *      from : 关联查询的core关联字段的名称,可以理解为两张表的关联主外键
         *      to : 本身查询的core关联字段的名称,可以理解为两张表的关联主外键
         * 大括号外的内容:
         *      查询条件:查询条件只能是关联查询core的字段,也就是必须要core_a的字段,否则会出现500,未定义的字段
         *      多个查询条件通过 && 拼接
         * 翻译成正常的数据库SQL语句:select * from  core_url u where u.关联字段名称 in(select b.关联字段名称 from  core_b b where 查询条件)
         */
        solrQuery.setQuery("{!join fromIndex=instance toIndex=esbinstance from=INSTANCE_UUID to=INSTANCE_UUID}INSTANCE_UUID:4e19adf7-18e7-4d45-8546-68503bd4aa5b && TYPE:in");

        try {
            QueryResponse response = client.query(solrQuery);
            SolrDocumentList solrDocumentList = response.getResults();
            Long total = solrDocumentList.getNumFound();
            System.out.println("查询总数是:" + total);
            if(total > 0){
                int number = 0;
                for(SolrDocument document : solrDocumentList){
                    String instanceUUid = String.valueOf(document.getFieldValue("INSTANCE_UUID"));
                    String serviceName = String.valueOf(document.getFieldValue("SERVICE_NAME"));
                    String type = String.valueOf(document.getFieldValue("TYPE"));
                    System.out.println("序号:" + (++number) + ", 实例ID:" + instanceUUid + ", 服务名称:" + serviceName + ", 类型:" + type);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值