solr开发,提交索引数据的几种方式
今天抽空學(xué)習(xí)了一下solr,有新東西學(xué)習(xí)就是哈皮! 期待能有機會與實戰(zhàn).實例僅為個人理解學(xué)習(xí)實例.
提交到Solr服務(wù)器上的數(shù)據(jù)必須是 SolrInputDocument 類型.
方案一:利用反射,自定義轉(zhuǎn)換機制
JavaBean對象轉(zhuǎn)換成SolrInputDocument的方式我們可以自定義.如果我們的Model類符合JavaBean的規(guī)范,那么我們可以使用反射獲取其內(nèi)部信息.
/*** @author dennisit@163.com* * 實體類與SolrInputDocument轉(zhuǎn)換 [測試通過]* * @param obj* 實體對象* @return SolrInputDocument* SolrInputDocument對象*/public static SolrInputDocument entity2SolrInputDocument(Object obj) {if (obj != null) {Class<?> cls = obj.getClass();Field[] filedArrays = cls.getDeclaredFields(); //獲取類中所有屬性Method m = null;SolrInputDocument sid = new SolrInputDocument();for (Field f : filedArrays) {//因為如果對象序列化之后,會增加該屬性,不用對該屬性進行反射if(!f.getName().equals("serialVersionUID")){ try {//跟進屬性xx構(gòu)造對應(yīng)的getXx()方法String dynamicGetMethod = dynamicMethodName(f.getName(), "get");//調(diào)用構(gòu)造的getXx()方法m = cls.getMethod(dynamicGetMethod); //屬性名,與對應(yīng)的屬性值 get方法獲取到的值LOG.info(f.getName() + ":" + m.invoke(obj));sid.addField(""+ f.getName(), m.invoke(obj));} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace(); }}}return sid;}LOG.warn("Object to convert is null.");return null;}此時我們可以使用server中提供的添加solrInputDocument對象的方法進行數(shù)據(jù)建立索引.
/*** 將對象集合添加至索引[測試通過]* @author pudongping* @param server* @param lists 自定義轉(zhuǎn)換機制*/public static <T> void addConvertBeans(SolrServer server, List<T> lists){try {server.add(EntityConvert.entityList2SolrInputDocument(lists));server.commit(false, false);LOG.info("Add convert object list to index finished. ");} catch (Exception e) {LOG.error("Add convert object list to index error, " + e.getMessage(), e);}}/*** 將對象集合添加至索引[測試通過]* @author pudongping* @param server* @param lists 自定義轉(zhuǎn)換機制*/public static <T> void addConvertBeans(SolrServer server, List<T> lists){try {server.add(EntityConvert.entityList2SolrInputDocument(lists));server.commit(false, false);LOG.info("Add convert object list to index finished. ");} catch (Exception e) {LOG.error("Add convert object list to index error, " + e.getMessage(), e);}}測試自定義轉(zhuǎn)換對象建立索引.
@Testpublic void addConvertBean(){Article article1 = new Article();article1.setId(UUID.randomUUID().toString());List<String> title = new ArrayList<String>();title.add("我在門后假裝你人還沒走");article1.setTitle(title);article1.setAuthor("周杰倫");SolrEngineHandler.addConvertBean(server, article1);}@Testpublic void addConvertBeans(){List<Article> lists = new ArrayList<Article>();Article art1 = new Article();art1.setId(UUID.randomUUID().toString());List<String> atlts1 = new ArrayList<String>();atlts1.add("誰言別后終無悔,寒月清宵綺夢回");atlts1.add("深知身在情長在,前塵不共彩云飛");art1.setTitle(atlts1);art1.setAuthor("柳夢璃");lists.add(art1);Article art2 = new Article();art2.setId(UUID.randomUUID().toString());List<String> atlts2 = new ArrayList<String>();atlts2.add("蕭蕭衷曲無處訴;為伊故,樂所苦。");atlts2.add("錦色芳華,豈堪人虛度?欲寄相思情萬縷,捎不到,君心處。");art2.setTitle(atlts2);art2.setAuthor("柳夢璃");lists.add(art2);SolrEngineHandler.addConvertBeans(server, lists);}方法二: 使用solr提供的注解機制
說明: @Field無參數(shù)時,匹配當(dāng)前字段,也可以自定義,字段必須在schema.xml 中的Filed中存在.
package com.test.model;import java.io.Serializable; import java.util.List;import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.solr.client.solrj.beans.Field;public class Article implements Serializable{/*** */private static final long serialVersionUID = 4017316764889231758L;@Field("id")private String id;@Field("title")private List<String> title; @Fieldprivate String author; //@Field無參數(shù)時,匹配當(dāng)前字段public String getId() {return id;}public void setId(String id) {this.id = id;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public List<String> getTitle() {return title;}public void setTitle(List<String> title) {this.title = title;}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}} package com.test.model;import java.io.Serializable; import java.util.List;import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.solr.client.solrj.beans.Field;public class Article implements Serializable{/*** */private static final long serialVersionUID = 4017316764889231758L;@Field("id")private String id;@Field("title")private List<String> title; @Fieldprivate String author; //@Field無參數(shù)時,匹配當(dāng)前字段public String getId() {return id;}public void setId(String id) {this.id = id;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public List<String> getTitle() {return title;}public void setTitle(List<String> title) {this.title = title;}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}}使用solrJ提供的addBean(..)與addBeans(…)相關(guān)的方法添加對象
/*** 將單個對象添加至索引* @author pudongping* @param server* @param object solr機制進行對象轉(zhuǎn)換*/public static void addBean(SolrServer server, Object object){try {server.addBean(object);server.commit(false,false);LOG.info("Add object to index finished.");} catch (Exception e) {LOG.error("Add object to index error, " + e.getMessage(), e);e.printStackTrace();}}/*** 添加集合對象至索引 [測試通過]* @author pudongping* @param <T>* @param server* @param lists 使用solr內(nèi)部轉(zhuǎn)換機制*/public static <T> void addBeans(SolrServer server, List<T> lists){try {server.addBeans(lists);server.commit(false, false);LOG.info("Add object list to index finished. ");} catch (Exception e) {LOG.error("Add object list to index finished. ");}}編寫junit測試
@Testpublic void addBean(){Article article1 = new Article();article1.setId(UUID.randomUUID().toString());List<String> title = new ArrayList<String>();title.add("地圖青島,末世孤島.");article1.setTitle(title);article1.setAuthor("蘇若年");SolrEngineHandler.addBean(server, article1);}@Testpublic void addBeans(){List<Article> lists = new ArrayList<Article>();Article art1 = new Article();art1.setId(UUID.randomUUID().toString());List<String> atlts1 = new ArrayList<String>();atlts1.add("誰言別后終無悔,寒月清宵綺夢回");atlts1.add("深知身在情長在,前塵不共彩云飛");art1.setTitle(atlts1);art1.setAuthor("蘇若年");lists.add(art1);Article art2 = new Article();art2.setId(UUID.randomUUID().toString());List<String> atlts2 = new ArrayList<String>();atlts2.add("蕭蕭衷曲無處訴;為伊故,樂所苦。");atlts2.add("錦色芳華,豈堪人虛度?欲寄相思情萬縷,捎不到,君心處。");art2.setTitle(atlts2);art2.setAuthor("柳夢璃");lists.add(art2);SolrEngineHandler.addBeans(server, lists);}?轉(zhuǎn)載請注明出處:[http://www.cnblogs.com/dennisit/p/3621717.html]
轉(zhuǎn)載于:https://www.cnblogs.com/dennisit/p/3621717.html
總結(jié)
以上是生活随笔為你收集整理的solr开发,提交索引数据的几种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB优化之二:常见优化方法
- 下一篇: 垃圾回收算法与垃圾回收器