solr開發,提交索引數據的幾種方式


今天抽空學習了一下solr,有新東西學習就是哈皮! 期待能有機會與實戰.實例僅為個人理解學習實例.
提交到Solr服務器上的數據必須是 SolrInputDocument 類型.

方案一:利用反射,自定義轉換機制

JavaBean對象轉換成SolrInputDocument的方式我們可以自定義.如果我們的Model類符合JavaBean的規范,那么我們可以使用反射獲取其內部信息.

    
    /** * @author dennisit@163.com * * 實體類與SolrInputDocument轉換 [測試通過] * * @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構造對應的getXx()方法
                        String dynamicGetMethod = dynamicMethodName(f.getName(), "get"); //調用構造的getXx()方法
                        m = cls.getMethod(dynamicGetMethod); //屬性名,與對應的屬性值 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對象的方法進行數據建立索引.

    
    /** * 將對象集合添加至索引[測試通過] * @author pudongping * @param server * @param lists 自定義轉換機制 */
    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 自定義轉換機制 */
    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); } } 

測試自定義轉換對象建立索引.

 @Test public 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); } @Test public 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無參數時,匹配當前字段,也可以自定義,字段必須在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; @Field private String author;            //@Field無參數時,匹配當前字段
    
    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; } @Override public 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; @Field private String author;            //@Field無參數時,匹配當前字段
    
    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; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }

使用solrJ提供的addBean(..)與addBeans(…)相關的方法添加對象

    /** * 將單個對象添加至索引 * @author pudongping * @param server * @param object solr機制進行對象轉換 */
    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內部轉換機制 */
    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測試

 @Test public 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); } @Test public 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); } 

 轉載請注明出處:[http://www.cnblogs.com/dennisit/p/3621717.html]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM