Solr 将数据库中table中数据导入到索引

来源:互联网 发布:excel 2013数据有效性 编辑:程序博客网 时间:2024/05/21 13:11
Solr将数据库中table中的数据导入到索引 

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明. 
原文出处:http://tbwuming.iteye.com/blog/1152333 

1、首先在MySQL中创建表,并写入数据 
Sql代码  收藏代码
  1. -- ----------------------------  
  2. -- Table structure for course  
  3. -- ----------------------------  
  4. CREATE TABLE `course` (  
  5.   `id` int(11) NOT NULL,  
  6.   `uservarchar(20) NOT NULL,  
  7.   `title` varchar(50) NOT NULL,  
  8.   `content` varchar(200) NOT NULL,  
  9.   `time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',  
  10.   PRIMARY KEY (`id`)  
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  


Sql代码  收藏代码
  1. -- ----------------------------  
  2. -- Records  
  3. -- ----------------------------  
  4. INSERT INTO `course` VALUES ('1''tiehong''搜索''这一小节讲搜索引擎,可以通过搜索引擎查找一些数据''2011-08-18 10:41:35');  
  5. INSERT INTO `course` VALUES ('2''chenyun''存储''这一小节讲分布式存储,可以存储很多数据''2011-08-18 10:42:19');  
  6. INSERT INTO `course` VALUES ('3''lengda''数据导入''这一小节讲数据导入,可以从mysql数据库中导入数据''2011-08-18 10:42:59');  


2、修改apache-solr-3.3.0\example\solr\conf\schema.xml文件 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <schema name="example" version="1.4">  
  3.   <types>      
  4.      <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>  
  5.   
  6.      <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>  
  7.   
  8.      <fieldType name="text" class="solr.TextField" positionIncrementGap="100">  
  9.       <analyzer type="index">  
  10.         <tokenizer class="solr.StandardTokenizerFactory"/>  
  11.         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />  
  12.         <filter class="solr.LowerCaseFilterFactory"/>  
  13.       </analyzer>  
  14.       <analyzer type="query">  
  15.         <tokenizer class="solr.StandardTokenizerFactory"/>  
  16.         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />  
  17.         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>  
  18.         <filter class="solr.LowerCaseFilterFactory"/>  
  19.       </analyzer>  
  20.     </fieldType>  
  21.   
  22.      <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>    
  23. </types>  
  24.   
  25. <fields>  
  26.    <field name="id" type="tint" indexed="true" stored="true" required="true" />  
  27.    <field name="user" type="string" indexed="true" stored="true"/>  
  28.    <field name="title" type="text" indexed="true" stored="true"/>   
  29.    <field name="content" type="text" indexed="true" stored="true" />   
  30.    <field name="time" type="date" indexed="true" stored="true" default="NOW"/>    
  31. </fields>  
  32.   
  33. <uniqueKey>id</uniqueKey>  
  34. <defaultSearchField>title</defaultSearchField>   
  35. <solrQueryParser defaultOperator="AND"/>    
  36.   
  37. </schema>  



3、编辑apache-solr-3.3.0\example\solr\conf\solrconfig.xml文件,添加内容如下: 
Xml代码  收藏代码
  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">   
  2.           <lst name="defaults">   
  3.                <str name="config">data-config.xml</str>   
  4.           </lst>   
  5. </requestHandler>  



4、创建data-config.xml文件,放在apache-solr-3.3.0\example\solr\conf\目录下,文件内容如下: 
Xml代码  收藏代码
  1. <dataConfig>   
  2.   <dataSource type="JdbcDataSource"   
  3.               driver="com.mysql.jdbc.Driver"   
  4.               url="jdbc:mysql://localhost/dbname"   
  5.               user="user-name"   
  6.               password="password"/>   
  7.   <document>   
  8.     <entity name="id"   
  9.             query="select * from course">   
  10.     </entity>   
  11.   </document>   
  12. </dataConfig>    


5、将MySQL的JDBC驱动放在apache-solr-3.3.0\example\lib目录下 

6、启动Solr服务,命令行进入apache-solr-3.3.0\example\目录,运行 java -jar  start.jar 
     出现问题: 
Java代码  收藏代码
  1. 严重: org.apache.solr.common.SolrException: QueryElevationComponent requires the  
  2. schema to have a uniqueKeyField implemented using StrField at org.apache.solr.handler.component.QueryElevationComponent.inform(QueryElevationComponent.java:158)  
  3.         at org.apache.solr.core.SolrResourceLoader.inform(SolrResourceLoader.java:522)  
  4.         at org.apache.solr.core.SolrCore.<init>(SolrCore.java:594)  
  5.         at org.apache.solr.core.CoreContainer.create(CoreContainer.java:463)  
  6.         at org.apache.solr.core.CoreContainer.load(CoreContainer.java:316)  
  7.         at org.apache.solr.core.CoreContainer.load(CoreContainer.java:207)  
  8.         at org.apache.solr.core.CoreContainer$Initializer.initialize(CoreContainer.java:130)  
  9.         at org.apache.solr.servlet.SolrDispatchFilter.init(SolrDispatchFilter.java:94)  
  10.         at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)  
  11.         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  12.         at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:713)  
  13.         at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)  
  14.         at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)  
  15.         at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)  
  16.         at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)  
  17.         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  18.         at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)  
  19.         at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)  
  20.         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  21.         at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)  
  22.         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  23.         at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)  
  24.         at org.mortbay.jetty.Server.doStart(Server.java:224)  
  25.         at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  26.         at org.mortbay.xml.XmlConfiguration.main(XmlConfiguration.java:985)  
  27.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  28.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  29.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  30.         at java.lang.reflect.Method.invoke(Method.java:597)  
  31.         at org.mortbay.start.Main.invokeMain(Main.java:194)  
  32.         at org.mortbay.start.Main.start(Main.java:534)  
  33.         at org.mortbay.start.Main.start(Main.java:441)  
  34.         at org.mortbay.start.Main.main(Main.java:119)  

     解决: 
          修改apache-solr-3.3.0\example\solr\conf\solrconfig.xml文件,删除内容如下: 
          
  
Xml代码  收藏代码
  1. <!-- Query Elevation Component  
  2.        http://wiki.apache.org/solr/QueryElevationComponent  
  3.   
  4.        a search component that enables you to configure the top  
  5.        results for a given query regardless of the normal lucene  
  6.        scoring.  
  7.     -->  
  8.   <searchComponent name="elevator" class="solr.QueryElevationComponent" >  
  9.     <!-- pick a fieldType to analyze queries -->  
  10.     <str name="queryFieldType">string</str>  
  11.     <str name="config-file">elevate.xml</str>  
  12.   </searchComponent>  
  13.   
  14.   <!-- A request handler for demonstrating the elevator component -->  
  15.   <requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">  
  16.     <lst name="defaults">  
  17.       <str name="echoParams">explicit</str>  
  18.     </lst>  
  19.     <arr name="last-components">  
  20.       <str>elevator</str>  
  21.     </arr>  
  22.   </requestHandler>  


     wiki上的解释: 
         
引用
The QueryElevationComponent enables you to configure the top results for a given query regardless of the normal lucene scoring. This is sometimes called "sponsored search", "editorial boosting" or "best bets".           This component matches the user query text to a configured Map of top results. Although this component will work with any QueryParser, it makes the most sense to use with DisMax style queries.

     我的理解:相当于竞价排名,无视搜索的排序,可以额外在顶部配置自定义的结果 


7、运行命令:在浏览器中输入:http://localhost:8983/solr/dataimport?command=full-import 来完成全量数据导入,在每次全量数据导入执行的时候,原有索引会被删除,如果不想删除原有索引,可以运行如下命令:http://localhost:8983/solr/dataimport?command=full-import&clean=false  ,全量数据导入在浏览器中显示的效果如下: 

Xml代码  收藏代码
  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.  
  2. <response>  
  3.     <lst name="responseHeader">  
  4.         <int name="status">0</int>  
  5.         <int name="QTime">5</int>  
  6.     </lst>  
  7.     <lst name="initArgs">  
  8.         <lst name="defaults">  
  9.              <str name="config">data-config.xml</str>  
  10.         </lst>  
  11.     </lst>  
  12.     <str name="command">full-import</str>  
  13.     <str name="status">idle</str>  
  14.     <str name="importResponse"/>  
  15.     <lst name="statusMessages"/>  
  16.     <str name="WARNING">  
  17.         This response format is experimental. It is likely to change in the future.  
  18.     </str>  
  19. </response>  


8、进行搜索,在浏览器中输入http://localhost:8983/solr/admin/ 




搜索结果如下: 
Xml代码  收藏代码
  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.  
  2. <response>  
  3.     <lst name="responseHeader">  
  4.         <int name="status">0</int>  
  5.         <int name="QTime">0</int>  
  6.         <lst name="params">  
  7.             <str name="indent">on</str>  
  8.             <str name="start">0</str>  
  9.             <str name="q">*:*</str>  
  10.             <str name="version">2.2</str>  
  11.             <str name="rows">10</str>  
  12.         </lst>  
  13.     </lst>  
  14.     <result name="response" numFound="3" start="0">  
  15.       <doc>  
  16.         <str name="content">这一小节讲搜索引擎,可以通过搜索引擎查找一些数据</str>  
  17.         <int name="id">1</int>  
  18.         <date name="time">2011-08-18T02:41:35Z</date>  
  19.         <str name="title">搜索</str>  
  20.         <str name="user">tiehong</str>  
  21.       </doc>  
  22.       <doc>  
  23.         <str name="content">这一小节讲分布式存储,可以存储很多数据</str>  
  24.         <int name="id">2</int>  
  25.         <date name="time">2011-08-18T02:42:19Z</date>  
  26.         <str name="title">存储</str>  
  27.         <str name="user">chenyun</str>  
  28.       </doc>  
  29.       <doc>  
  30.         <str name="content">这一小节讲数据导入,可以从mysql数据库中导入数据</str>  
  31.         <int name="id">3</int>  
  32.         <date name="time">2011-08-18T02:42:59Z</date>  
  33.         <str name="title">数据导入</str>  
  34.         <str name="user">lengda</str>  
  35.       </doc>  
  36.     </result>  
  37. </response>  


9、以不同的名字索引域 
     上面data-config.xml配置中mysql中表的名字和schema.xml索引的名字相同,也可以配置使用不同的名字,如下: 
Xml代码  收藏代码
  1. <dataConfig>  
  2.   <dataSource type="JdbcDataSource"  
  3.               driver="com.mysql.jdbc.Driver"  
  4.               url="jdbc:mysql://localhost/dbname"  
  5.               user="user-name"  
  6.               password="password"/>  
  7.   <document>  
  8.     <entity name="id"  
  9.             query="select id,name,desc from mytable">  
  10.        <field column="id" name="solr_id"/>  
  11.        <field column="name" name="solr_name"/>  
  12.        <field column="desc" name="solr_desc"/>  
  13.     </entity>  
  14.   </document>  
  15. </dataConfig>  

     此时,solr_id, solr_name,solr_desc将被写到solr域中,务必注意要在schema.xml文件中配置好这些域 

10、从多个表索引数据到Solr 
     修改data-config.xml文件 
Xml代码  收藏代码
  1. <dataConfig>  
  2.   <dataSource type="JdbcDataSource"  
  3.               driver="com.mysql.jdbc.Driver"  
  4.               url="jdbc:mysql://localhost/dbname"  
  5.               user="user-name"  
  6.               password="password"/>  
  7.   <document>  
  8.     <entity name="outer"  
  9.             query="select id,name,desc from mytable">  
  10.        <field column="id" name="solr_id"/>  
  11.        <field column="name" name="solr_name"/>  
  12.        <field column="desc" name="solr_desc"/>  
  13.        <entity name="inner"  
  14.                query="select details from another_table where id ='${outer.id}'">  
  15.               <field column="details" name="solr_details"/>  
  16.        </entity>  
  17.     </entity>  
  18.   </document>  
  19. </dataConfig>  

     注意:schema.xml中还应该有solr_details域 

11、参考: 
     Solr Data Import 快速入门:http://blog.chenlb.com/2010/03/solr-data-import-quick-start.html 
     Index a DB table directly into Solr:http://wiki.apache.org/solr/DIHQuickStart