zoukankan      html  css  js  c++  java
  • solr导入mysql数据库

    感谢ITeye的博主viskyzz分享的经验,笔者基本参考ta的方法。然而,解决中间出现的问题时也融入了自己的经验。

    查看ta的原文请戳:

    http://tbwuming.iteye.com/blog/1152333

    默认已经建好了数据库的表。

    配置过程:

    1.改写solrconfig.xml,向其中加入:

    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
              <lst name="defaults">
                   <str name="config">data-config.xml</str>
              </lst>
    </requestHandler>

    同时记得要导入相应lib,否则会报错:requesthander init failure,java.lang.ClassNotFoundException: org.apache.solr.handler.dataimport.DataImportHandler

     <lib dir="../../../dist" regex="solr-dataimporthandler-d.*.jar" />

    2.在与solrconfig.xml相同的目录下,添加data-config.xml,写入:

    <dataConfig>
      <dataSource type="JdbcDataSource"
                  driver="com.mysql.jdbc.Driver" //一般都是这样,这个看你下载的mysql的jdbc驱动中Driver.class的目录层次,把.想成/就好
                  url="jdbc:mysql://localhost/你的数据库名"
                  user="你的用户名"
                  password="你的密码"/>
      <document>
        <entity name="id"
                query="select * from course">
        </entity>
      </document>
    </dataConfig> 

    3.下载mysql的jdbc驱动,将其中的.jar解压出来,复制到$solr_home$/example/lib下。但是笔者启动solr后发现还是会报错not found jdbc driver。笔者找了很多资料,都说的是配置问题,但是上面的配置应该是没有问题了。最后将.jar复制到$solr_home$/example/lib/ext下,就好了。

    所以请复制到lib以及lib下的ext下吧!

    4.根据数据库的各个属性(比如例子中的id,user,title,content,time),改写schema.xml,最好是先备份原来的,中间出现各种报错的话方便拯救。往里添加:
      <types>    
         <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>

         <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

         <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
          <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.LowerCaseFilterFactory"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
          </analyzer>
        </fieldType>

         <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>  
    </types>

    <fields>
       <field name="id" type="tint" indexed="true" stored="true" required="true" />
       <field name="user" type="string" indexed="true" stored="true"/>
       <field name="title" type="text" indexed="true" stored="true"/>
       <field name="content" type="text" indexed="true" stored="true" />
       <field name="time" type="date" indexed="true" stored="true" default="NOW"/>  
    </fields>

    <uniqueKey>id</uniqueKey>
    <defaultSearchField>title</defaultSearchField>
    <solrQueryParser defaultOperator="AND"/> 
    </schema>

    (运行起来应该会报错,错误原因往往是field的定义和原来schema中的定义重复,可以稍作删改)

    5.笔者为了防止重复定义,把上面的属性皆改为:myid,myusr,mytitle,mycontent,mytime。接着报错Document is missing mandatory uniqueKey field: id 。

    经过各种尝试+想像,发现是因为solr对文档建索引时,要按照文档的独一无二的id,id是不可缺少的,相当于关系数据库的主键。

    因此,数据库的表中必须有一项id属性,可以是本身的主键,也可是为了索引而添加的。因此,表中的每一项其实相当于一个文档。

    笔者解决方法就是将数据库中的主键myid改回id,并且删掉schema.xml中的重复定义,就好了。

    6.启动solr,切到$solr_home$/example下,java -jar start.jar

    7.若报错QueryElevationComponent requires theschema to have a uniqueKeyField implemented using StrField at org.apache.solr.handler.component.QueryElevationComponent.inform

    ,改写solrconfig.xml,注释掉以下:

    <!-- Query Elevation Component
           http://wiki.apache.org/solr/QueryElevationComponent

           a search component that enables you to configure the top
           results for a given query regardless of the normal lucene
           scoring.
        -->
      <searchComponent name="elevator" class="solr.QueryElevationComponent" >
        <!-- pick a fieldType to analyze queries -->
        <str name="queryFieldType">string</str>
        <str name="config-file">elevate.xml</str>
      </searchComponent>

      <!-- A request handler for demonstrating the elevator component -->
      <requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
        <lst name="defaults">
          <str name="echoParams">explicit</str>
        </lst>
        <arr name="last-components">
          <str>elevator</str>
        </arr>
      </requestHandler>

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

    9.进行搜索,在浏览器中输入http://localhost:8983/solr/admin/,query就可以出来结果了!

  • 相关阅读:
    精品网站集合
    javascript中关于数组的一些鄙视题
    如何使用github搭建个人博客
    JS复杂数据拆分重组
    如何上传图片到七牛云
    React全家桶+Material-ui构建的后台管理系统
    Javascript继承6:终极继承者----寄生组合式继承
    Javascript继承5:如虎添翼----寄生式继承
    Javascript继承4:洁净的继承者----原型式继承
    Javascript继承3:将优点为我所有----组合式继承
  • 原文地址:https://www.cnblogs.com/linlu1142/p/3210871.html
Copyright © 2011-2022 走看看