您的位置:首页 > 其它

solr6使用solrJ做XML数据导入

2016-10-09 16:04 387 查看
摘要: Solr6.0的solrJ接口有部分变化,我将使用SolrJ的API,把一段XML文档数据插入到Solr数据库中。

需要的软件支持

JDK1.8以上

Solr6.0

Eclipse 4.5

solr-solrj-6.0.0.jar

dom4j-1.6.1.jar

XML文档转换为Java对象

我准备了一段XML数据,保存在cd.xml文档中。

<CATALOG>
<CD>
<TITLE>皇帝讽刺剧</TITLE>
<ARTIST>鲍勃·迪伦</ARTIST>
<COUNTRY>美国</COUNTRY>
<COMPANY>哥伦比亚</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
<DESCRIPTION>夏天的午后听Bob Dylan的歌特别容易被催眠</DESCRIPTION>
</CD>
<CD>
<TITLE>隐藏自己的心</TITLE>
<ARTIST>邦尼泰勒</ARTIST>
<COUNTRY>英国</COUNTRY>
<COMPANY>哥伦比亚广播公司</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
<DESCRIPTION>对未来,永远抱著乐观与喜悦的态度</DESCRIPTION>
</CD>
<CD>
<TITLE>精选辑</TITLE>
<ARTIST>桃莉·巴顿</ARTIST>
<COUNTRY>美国</COUNTRY>
<COMPANY>美国无线电公司</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
<DESCRIPTION>美国历史上最畅销的录音室唱片</DESCRIPTION>
</CD>
<CD>
<TITLE>依然忧郁</TITLE>
<ARTIST>盖瑞摩尔</ARTIST>
<COUNTRY>英国</COUNTRY>
<COMPANY>维京唱片</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
<DESCRIPTION>在听到他们的现场之后,会爱上这些老男人的声音</DESCRIPTION>
</CD>
<CD>
<TITLE>厄洛斯</TITLE>
<ARTIST>艾罗斯雷玛若提</ARTIST>
<COUNTRY>欧盟</COUNTRY>
<COMPANY>贝塔斯曼音乐集团</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
<DESCRIPTION>这张专辑以希腊神话中的人物为音乐背景,突显了希腊作为一个文明古国所拥有的很深厚的文化积淀</DESCRIPTION>
</CD>
<CD>
<TITLE>仅此一夜</TITLE>
<ARTIST>比吉斯乐队</ARTIST>
<COUNTRY>英国</COUNTRY>
<COMPANY>环球唱片</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
<DESCRIPTION>青春活力十足,主唱声线可塑性强</DESCRIPTION>
</CD>
<CD>
<TITLE>麦其·梅</TITLE>
<ARTIST>罗德·斯图尔特</ARTIST>
<COUNTRY>英国</COUNTRY>
<COMPANY>匹克威克</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
<DESCRIPTION>作者是最有才华的词曲作者之一,是二十世纪六十年代中期的英国入侵浪潮之后的标志性人物之一。</DESCRIPTION>
</CD>
<CD>
<TITLE>浪漫曲</TITLE>
<ARTIST>安德烈·波伽利</ARTIST>
<COUNTRY>欧盟</COUNTRY>
<COMPANY>环球唱片</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
<DESCRIPTION>独一无二的声音的力量、那令人难以抗拒的温暖的感觉,这使得语言和文化都不再是阻挡交流的障碍。</DESCRIPTION>
</CD>
<CD>
<TITLE>当男人爱上女人</TITLE>
<ARTIST>普西·斯乐巨</ARTIST>
<COUNTRY>美国</COUNTRY>
<COMPANY>大西洋</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
<DESCRIPTION>他无法假装若无其事,他会用全世界来交换,只为了他找到的好东西.即使她很坏,他也看不见,她不会有错,他会背弃他最要好</DESCRIPTION>
</CD>
<CD>
<TITLE>美好时光</TITLE>
<ARTIST>肯尼·罗杰斯</ARTIST>
<COUNTRY>英国</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
<DESCRIPTION>这哥们的歌都是自觉自发热爱自己一亩三分地的城市贫民心声,毫无怨言。永远欢乐,永远飞的大。</DESCRIPTION>
</CD>
<CD>
<TITLE>大丈夫日记</TITLE>
<ARTIST>威尔·史密斯</ARTIST>
<COUNTRY>美国</COUNTRY>
<COMPANY>哥伦比亚</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
<DESCRIPTION>这个还真纽约那种感觉,特派对,流说。而且阵容强大,真正的全能明星。</DESCRIPTION>
</CD>
</CATALOG>


首先需要读文件,将XML文件以流的形式读取出来。

建立java bean, CD.java

package com.trainning.project;

public class CD {
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 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 + "]";
}
}


将XML文档转换为Java bean, ReadXMLFile.java

用Java将XML文件转换为Java对象,可以使用dom4j或者sax解析方式。这里使用SAX方式解析,返回得到的数据List集合。

package com.trainning.project;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ReadXMLFile {
public static List<CD> getXMLFileList(String filepath) {
//创建文件对象
File file = new File(filepath);
//构建SAX读写器
SAXReader saxReader = new SAXReader();
//将XML文件内容保存在List中
List<CD> cds = new ArrayList<CD>();
try {
//加载文件
Document document = saxReader.read(file);
//获取根元素
Element root =document.getRootElement();
//获取根元素下的所有子元素
List<Element> list = root.elements();
//将文件元素内容赋值给java bean
for(Element e : list){
CD cd = new CD();
cd.setTitle(e.elementText("TITLE"));
cd.setArtist(e.elementText("ARTIST"));
cd.setCompany(e.elementText("COMPANY"));
cd.setCountry(e.elementText("COUNTRY"));
cd.setPrice(Double.parseDouble(e.elementText("PRICE")));
cd.setYear(e.elementText("YEAR"));
cd.setDescription(e.elementText("DESCRIPTION"));
cds.add(cd);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return cds;
}
}


使用SolrJ将List数据导入到Solr数据库

新建一个文件SolrPublisher.java

package com.trainning.project;

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/cd.xml";
List<CD> list = ReadXMLFile.getXMLFileList(filepath);
list.stream().forEach(System.out::println);
for(CD 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();
}

public static void main(String[] args) {
SolrPublisher publisher = new SolrPublisher();
try {
publisher.insertDataToSolr();
} catch (Exception e) {
e.printStackTrace();
}

}

}


查看Solr中的数据

直接使用http方式来查询solr中的数据。

访问: http://localhost:8080/solr/core0/select?q=* : *



最后,你可以在这里https://github.com/cj96248/solr找到项目的源代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  solr xml 数据导入