1. 程式人生 > >Solr6使用SolrJ匯入JSON資料

Solr6使用SolrJ匯入JSON資料

需要的軟體支援

JDK1.8以上
Solr6.0
Eclipse 4.5
solr-solrj-6.0.0.jar
dom4j-1.6.1.jar
fastjson-1.2.7.jar

JSON文件轉換為Java物件

我準備了一段JSON資料,儲存在cd.json文件中。

[
      {
        "TITLE": "皇帝諷刺劇",
        "ARTIST": "鮑勃·迪倫",
        "COUNTRY": "美國",
        "COMPANY": "哥倫比亞",
        "PRICE": "10.90",
        "YEAR": "1985"
, "DESCRIPTION": "夏天的午後聽Bob Dylan的歌特別容易被催眠" }, { "TITLE": "隱藏自己的心", "ARTIST": "邦尼泰勒", "COUNTRY": "英國", "COMPANY": "哥倫比亞廣播公司", "PRICE": "9.90", "YEAR": "1988", "DESCRIPTION": "對未來,永遠抱著樂觀與喜悅的態度" }, { "TITLE": "精選輯"
, "ARTIST": "桃莉·巴頓", "COUNTRY": "美國", "COMPANY": "美國無線電公司", "PRICE": "9.90", "YEAR": "1982", "DESCRIPTION": "美國曆史上最暢銷的錄音室唱片" }, { "TITLE": "依然憂鬱", "ARTIST": "蓋瑞摩爾", "COUNTRY": "英國", "COMPANY": "維京唱片", "PRICE
": "10.20", "YEAR": "1990", "DESCRIPTION": "在聽到他們的現場之後,會愛上這些老男人的聲音" }, { "TITLE": "厄洛斯", "ARTIST": "艾羅斯雷瑪若提", "COUNTRY": "歐盟", "COMPANY": "貝塔斯曼音樂集團", "PRICE": "9.90", "YEAR": "1997", "DESCRIPTION": "這張專輯以希臘神話中的人物為音樂背景,突顯了希臘作為一個文明古國所擁有的很深厚的文化積澱" }, { "TITLE": "僅此一夜", "ARTIST": "比吉斯樂隊", "COUNTRY": "英國", "COMPANY": "環球唱片", "PRICE": "10.90", "YEAR": "1998", "DESCRIPTION": "青春活力十足,主唱聲線可塑性強" }, { "TITLE": "麥其·梅", "ARTIST": "羅德·斯圖爾特", "COUNTRY": "英國", "COMPANY": "匹克威克", "PRICE": "8.50", "YEAR": "1990", "DESCRIPTION": "作者是最有才華的詞曲作者之一,是二十世紀六十年代中期的英國入侵浪潮之後的標誌性人物之一。" }, { "TITLE": "浪漫曲", "ARTIST": "安德烈·波伽利", "COUNTRY": "歐盟", "COMPANY": "環球唱片", "PRICE": "10.80", "YEAR": "1996", "DESCRIPTION": "獨一無二的聲音的力量、那令人難以抗拒的溫暖的感覺,這使得語言和文化都不再是阻擋交流的障礙。" }, { "TITLE": "當男人愛上女人", "ARTIST": "普西·斯樂巨", "COUNTRY": "美國", "COMPANY": "大西洋", "PRICE": "8.70", "YEAR": "1987", "DESCRIPTION": "他無法假裝若無其事,他會用全世界來交換,只為了他找到的好東西.即使她很壞,他也看不見,她不會有錯,他會背棄他最要好" }, { "TITLE": "美好時光", "ARTIST": "肯尼·羅傑斯", "COUNTRY": "英國", "COMPANY": "Mucik Master", "PRICE": "8.70", "YEAR": "1995", "DESCRIPTION": "這哥們的歌都是自覺自發熱愛自己一畝三分地的城市貧民心聲,毫無怨言。永遠歡樂,永遠飛的大。" }, { "TITLE": "大丈夫日記", "ARTIST": "威爾·史密斯", "COUNTRY": "美國", "COMPANY": "哥倫比亞", "PRICE": "9.90", "YEAR": "1997", "DESCRIPTION": "這個還真紐約那種感覺,特派對,流說。而且陣容強大,真正的全能明星。" } ]

讀取JSON檔案資料:ReadJSONFile.java

package com.trainning.project.json;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class ReadJSONFile {
    /**
     * 將json檔案資料讀取到記憶體
     * @param filepath
     * @return json string
     */
    public static String readFile(String filepath){
        String json = "";
        try {
            File file = new File(filepath);
            FileInputStream fis = new FileInputStream(file);
            InputStreamReader isInputStreamReader = new InputStreamReader(fis, "UTF-8");
            BufferedReader brReader = new BufferedReader(isInputStreamReader);
            String line;
            while((line = brReader.readLine()) != null){
                json += line; 
            }
            brReader.close();
            isInputStreamReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return json;
    }
}

將json資料轉化為java物件,我這裡使用到了阿里巴巴的fastjson,這是一個開源專案,號稱有最快的解析速度,可以方便地進行序列化和反序列化操作。
建立javabean: CDBean.java

package com.trainning.project.json;

public class CDBean {
    private String title;
    private String artist;
    private String country;
    private String company;
    private double price;
    private String year;
    private String description;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getArtist() {
        return artist;
    }
    ......
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public String toString() {
        return "CD :[title=" + title + ", artist=" + artist + ", country=" + country + ", company=" + company
                + ", price=" + price + ", year=" + year + ", description=" + description + "]";
    }
}

轉化JSON資料:ConvertJSON.java

package com.trainning.project.json;

import java.util.List;

import com.alibaba.fastjson.JSON;

public class ConvertJSON {
    public static List<CDBean> jsonToList(String json){
        //把JSON文字parse成JavaBean集合 
        List<CDBean> list = JSON.parseArray(json,CDBean.class);
        //列印一下list的內容,除錯時用
        list.stream().forEach(System.out::println);
        return list;
    }
}

使用SolrJ將List資料匯入到Solr資料庫

  • 新建一個檔案SolrPublisher.java
package com.trainning.project.json;

import java.util.List;
import java.util.UUID;

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

public class SolrPublisher {
    public static final String SOLR_URL = "http://localhost:8080/solr/core0";
    private HttpSolrClient client;
    public SolrPublisher() {
        client = new HttpSolrClient(SOLR_URL);
    }

    public void insertDataToSolr() throws Exception{
        String filepath = "src/main/java/com/trainning/project/json/cd.json";
        String json = ReadJSONFile.readFile(filepath);
        List<CDBean> list = ConvertJSON.jsonToList(json);
        client.deleteByQuery("*:*");//清空solr中原有資料
        for(CDBean cd : list){
            SolrInputDocument input = new SolrInputDocument();
            //ID是資料的主鍵,原則上必須指定,並且不能重複。便於資料管理,如刪除操作
            input.addField("id", UUID.randomUUID().toString(), 1.0f);
            //這裡的addField方法第一個引數需要在core0/conf/managed-schema中有對應的field
            //引數使用的是managed-schema中有對應的field:<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
            //這個引數採用萬用字元的方式,指定一個string型別的欄位
            input.addField("title_s", cd.getTitle());
            input.addField("artist_s", cd.getArtist());
            input.addField("country_s", cd.getCountry());
            input.addField("company_s", cd.getCompany());
            input.addField("price_d", cd.getPrice());
            input.addField("year_s", cd.getYear());
            input.addField("description_s", cd.getDescription());
            client.add(input);
        }
        //不能忘記提交
        client.commit();
    }
    /**
     * 使用main方法測試整個插入過程是否能成功
     */
    public static void main(String[] args) {
        SolrPublisher publisher = new SolrPublisher();
        try {
            publisher.insertDataToSolr();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

檢視Solr中的資料

這裡寫圖片描述