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();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章