现在的位置: 首页 > 综合 > 正文

Solr 学习(3) —-Solr 数据导入 <一>DIH简单使用

2013年05月22日 ⁄ 综合 ⁄ 共 6836字 ⁄ 字号 评论关闭

转载自 http://martin3000.iteye.com/blog/1328833 
 

使用DataImportHandler进行简单数据导入还是比较有效的,特别是DIH中针对简单的数据库表,可以把完全导入和增量导入合并成一个语句,非常方便。我的使用方式如下所示

1。配置schema

 

 

Xml代码  收藏代码
  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
  2.     <lst name="defaults">  
  3.       <str name="config">/home/tomcat/bin/solr/conf/data-config.xml</str>  
  4.     </lst>  
  5.   </requestHandler>  

 

 

2.添加data-config文件

data-config.xml

 

 

Xml代码  收藏代码
  1. <dataConfig>  
  2.   <dataSource type="JdbcDataSource"   
  3.               driver="com.mysql.jdbc.Driver"  
  4.               url="jdbc:mysql://127.0.0.1/db"   
  5.               user="root"   
  6.               password="pass"  
  7.               batchSize="-1"/>  
  8.   <document>  
  9.     <entity name="id" pk="id"    
  10.             query="select id,username,text,cat  from hot where '${dataimporter.request.clean}' != 'false' OR timestamp > '${dataimporter.last_index_time}'">  
  11.          <field column="id" name="id"/>  
  12.          <field column="text" name="text"/>  
  13.          <field column="username" name="username_s"/>  
  14.          <field column="cat" name="cat_t"/>  
  15.     </entity>  
  16.   </document>  
  17. </dataConfig>  

 

3.让DIH周期性的运行

 修改dataimport.properties文件,这个是自动生成的,同在solr/conf下,添加参数

interval 间隔时间 单位 分钟

syncEnabled=1 打开周期运行

params 其实就是具体调用的url,周期运行就是周期性的访问一个url

 

 

Java代码  收藏代码
  1. #Wed Dec 28 09:29:42 UTC 2011  
  2. port=8983  
  3. interval=5  
  4. last_index_time=2011-12-28 09\:29\:26  
  5. syncEnabled=1  
  6. webapp=solr  
  7. id.last_index_time=2011-12-28 09\:29\:26  
  8. server=127.0.0.1  
  9. params=/select?qt\=/dataimport&command\=full-import&clean\=false&commit\=true&optimize\=false  

 

 

到此还并不能周期运行,在solr的wiki中有一段实现这个功能的代码,但并没有加入到solr的发行包中,于是我们需要重新编译这段代码,打包放到webapp/solr/WEB-INF/lib中才行

 

Xml代码  收藏代码
  1. <web-app>  
  2.    <listener>  
  3.        <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>  
  4.   </listener>  
  5.   ...  
  6. </web-app>  

 

 

 

以下是solr wiki上周期运行的代码,我已打好包,放在附件里。

 

 

Java代码  收藏代码
  1. package org.apache.solr.handler.dataimport.scheduler;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.IOException;  
  6. import java.util.Properties;  
  7.   
  8. import org.apache.solr.core.SolrResourceLoader;  
  9. import org.slf4j.Logger;  
  10. import org.slf4j.LoggerFactory;  
  11.   
  12. public class SolrDataImportProperties {  
  13.         private Properties properties;  
  14.   
  15.         public static final String SYNC_ENABLED         = "syncEnabled";  
  16.         public static final String SYNC_CORES           = "syncCores";  
  17.         public static final String SERVER               = "server";  
  18.         public static final String PORT                 = "port";  
  19.         public static final String WEBAPP               = "webapp";  
  20.         public static final String PARAMS               = "params";  
  21.         public static final String INTERVAL             = "interval";  
  22.   
  23.         private static final Logger logger = LoggerFactory.getLogger(SolrDataImportProperties.class);  
  24.   
  25.         public SolrDataImportProperties(){  
  26. //              loadProperties(true);  
  27.         }  
  28.   
  29.         public void loadProperties(boolean force){  
  30.                 try{  
  31.                         SolrResourceLoader loader = new SolrResourceLoader(null);  
  32.                         logger.info("Instance dir = " + loader.getInstanceDir());  
  33.   
  34.                         String configDir = loader.getConfigDir();  
  35.                         configDir = SolrResourceLoader.normalizeDir(configDir);  
  36.                         if(force || properties == null){  
  37.                                 properties = new Properties();  
  38.   
  39.                                 String dataImportPropertiesPath = configDir + "\\dataimport.properties";  
  40.   
  41.                                 FileInputStream fis = new FileInputStream(dataImportPropertiesPath);  
  42.                                 properties.load(fis);  
  43.                         }  
  44.                 }catch(FileNotFoundException fnfe){  
  45.                         logger.error("Error locating DataImportScheduler dataimport.properties file", fnfe);  
  46.                 }catch(IOException ioe){  
  47.                         logger.error("Error reading DataImportScheduler dataimport.properties file", ioe);  
  48.                 }catch(Exception e){  
  49.                         logger.error("Error loading DataImportScheduler properties", e);  
  50.                 }  
  51.         }  
  52.   
  53.         public String getProperty(String key){  
  54.                 return properties.getProperty(key);  
  55.         }  
  56. }  

 

 

 

 

Java代码  收藏代码
  1. package org.apache.solr.handler.dataimport.scheduler;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.Timer;  
  6.   
  7. import javax.servlet.ServletContext;  
  8. import javax.servlet.ServletContextEvent;  
  9. import javax.servlet.ServletContextListener;  
  10.   
  11. import org.slf4j.Logger;  
  12. import org.slf4j.LoggerFactory;  
  13.   
  14. public class ApplicationListener implements ServletContextListener {  
  15.   
  16.         private static final Logger logger = LoggerFactory.getLogger(ApplicationListener.class);  
  17.   
  18.         @Override  
  19.         public void contextDestroyed(ServletContextEvent servletContextEvent) {  
  20.                 ServletContext servletContext = servletContextEvent.getServletContext();  
  21.   
  22.                 // get our timer from the context  
  23.                 Timer timer = (Timer)servletContext.getAttribute("timer");  
  24.   
  25.                 // cancel all active tasks in the timers queue  
  26.                 if (timer != null)  
  27.                         timer.cancel();  
  28.   
  29.                 // remove the timer from the context  
  30.                 servletContext.removeAttribute("timer");  
  31.   
  32.         }  
  33.   
  34.         @Override  
  35.         public void contextInitialized(ServletContextEvent servletContextEvent) {  
  36.                 ServletContext servletContext = servletContextEvent.getServletContext();  
  37.                 try{  
  38.                         // create the timer and timer task objects  
  39.                         Timer timer = new Timer();  
  40.                         HTTPPostScheduler task = new HTTPPostScheduler(servletContext.getServletContextName(), timer);  
  41.   
  42.                         // get our interval from HTTPPostScheduler  
  43.                         int interval = task.getIntervalInt();  
  44.   
  45.                         // get a calendar to set the start time (first run)  
  46.                         Calendar calendar = Calendar.getInstance();  
  47.   
  48.                         // set the first run to now + interval (to avoid fireing while the app/server is starting)  
  49.                         calendar.add(Calendar.MINUTE, interval);  
  50.                         Date startTime = calendar.getTime();  
  51.   
  52.                         // schedule the task  
  53.                         timer.scheduleAtFixedRate(task, startTime, 1000 * 60 * interval);  
  54.   
  55.                         // save the timer in context  
  56.                         servletContext.setAttribute("timer", timer);  
  57.   
  58.                 } catch (Exception e) {  
  59.                         if(e.getMessage().endsWith("disabled")){  
  60.                                 logger.info("Schedule disabled");  
【上篇】
【下篇】

抱歉!评论已关闭.