笔记记录,核心代码解释参见代码注释
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();
}
}
}