筆記記錄,核心代碼解釋參見代碼註釋
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();
}
}
}