以mysql为数据源的Solr配置

主要记录一下以mysql数据库为数据源的Solr平台的搭建过程,既为需要的同志提供点参考,也以防以后自己会需要。平台为Centos 6.5,需建立好Java环境,Solr为目前最新的5.4.0。

首先,从Solr官网下载文件,并解压到安装目录。实际上此时已经可以启动和进行访问了,具体过程如下:cd到安装目录,用命令 bin/solr start 启动服务器,然后在浏览器输入地址:localhost:8983/solr 就可以进行访问了,如果是远程访问则把localhost改成相应的ip地址即可。

下面介绍如何建立自己的Core:

首先,在安装目录下的server/solr/目录建立一个文件夹,文件夹名字与建立的core名字相同,比如我是对YahooAnswers的数据进行处理,core和文件夹都命名为YahooAnswers。YahooAnswers目录下建立两个文件夹,分别为conf和data,其中conf文件夹主要放配置文件,data文件夹放置生成的索引数据和log文件等。

conf文件夹下面主要由三个文件,分别为data-config.xml、schema.xml和solrconfig.xml,还有一些其他需要用到的文件,如stopwords.txt等。这三个文件都可以从其他地方拷贝过来再进行修改。以下给出我的配置文件。

第一个是solrconfig.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<config>
  <luceneMatchVersion>4.9</luceneMatchVersion>
  <lib dir="../../lib/" regex=".*\.jar" />
  <dataDir>${solr.core0.data.dir:}</dataDir>
  <schemaFactory class="ClassicIndexSchemaFactory"/>
  <updateHandler class="solr.DirectUpdateHandler2">
    <updateLog>
      <str name="dir">${solr.core0.data.dir:}</str>
    </updateLog>
  </updateHandler>
  <requestHandler name="/get" class="solr.RealTimeGetHandler">
    <lst name="defaults">
      <str name="omitHeader">true</str>
    </lst>
  </requestHandler>  
  <requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" /> 
  <requestDispatcher handleSelect="true" >
    <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" formdataUploadLimitInKB="2048" />
  </requestDispatcher>
  <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
  <requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" />
  <requestHandler name="/update" class="solr.UpdateRequestHandler"  />
  <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
  <requestHandler name="/admin/ping" class="solr.PingRequestHandler">
    <lst name="invariants">
      <str name="q">solrpingquery</str>
    </lst>
    <lst name="defaults">
      <str name="echoParams">all</str>
    </lst>
  </requestHandler>
	<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
		<lst name="defaults">  
		  <str name="config">data-config.xml</str>  
		</lst>  
	</requestHandler>  
  <!-- config for the admin interface --> 
  <admin>
    <defaultQuery>solr</defaultQuery>
  </admin>
</config>

这个文件好像一般不需要怎么修改,不过需要指定一个使用的jar包的目录,如这里的是<lib dir="../../../../dist/" regex=".*\.jar" />,一般指定为dist目录,其中有导入数据所需要的DataImportHandler的包等。不同版本的目录结构可能不太一样,需要根据实际情况进行设置。

第二个是data-config.xml:

<dataConfig>
    <dataSource type="JdbcDataSource"
              driver="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/yahoo!answer"
              user="root"
              password="123456" />
    <document name="test">
        <entity name="entity"
            query="SELECT uri, aid, answer_item FROM nbestanswers">
			<field column="uri" name="id" />  
        </entity>
    </document>
</dataConfig>
其中,url里的localhost可以改为远程的ip地址,yahoo!answer为mysql数据库的名字,user和password需要改成相应的用户名和密码,query为mysql查询语句,里面的字段会自动对应到field的相应字段,不过好像solr必须要有一个id字段,这里把uri字段匹配到id字段。

第三个是schema.xml,这个主要是对索引的方式进行配置:

<?xml version="1.0" ?>
<schema name="my core" version="1.1">

    <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
	
    <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- Case insensitive stop word removal.
        -->

        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
	 <similarity class="solr.BM25SimilarityFactory">
		  <float name="k1">1.2</float>
		  <float name="b">0.75</float>
	</similarity>
    </fieldType>
    <similarity class="solr.SchemaSimilarityFactory"/>
    
    <!-- general -->
    <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
    <field name="aid" type="string" indexed="true" stored="true" />
    <field name="answer_item" type="text_en_splitting" indexed="true" stored="true" />
    <field name="_version_" type="long" indexed="true" stored="true"/>

     <!-- field to use to determine and enforce document uniqueness. -->
     <uniqueKey>id</uniqueKey>

     <!-- field for the QueryParser to use when an explicit fieldname is absent -->
     <defaultSearchField>answer_item</defaultSearchField>

     <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
     <solrQueryParser defaultOperator="OR"/>
</schema>
其中fieldType字段对field类型进行定义,里面可以自定义各个field类型的过滤方式,检索时候的相似性计算方法等,如果需要使用可以参考example中的例子。这里主要修改的是field字段,field字段对应于data-config.xml里的数据,对每个数据进行参数设置,type为上面fieldType中定义的类型,indexed设置是否进行索引,其他类似。其中_version_字段是用来记录系统信息的,不能缺少,最好也不要进行修改。uniqueKey类似于Mysql的主键,指定一个唯一的字段,一般为id字段。defaultSearchField为默认搜索字段,当在solr搜索时不指定,则搜索的为这个这个字段。

另外,因为需要对mysql进行操作,要下载jdbc的jar包,我下载的是mysq-connector-java5.1.35-bin.jar,放到安装目录的server/solr-webapp/webapp/WEB-INF/lib/文件夹下。

至此,solr的配置基本就完成了,用bin/solr restart命令对solr进行重启,然后就可以在浏览器中进行访问了,如上文所述,地址为localhost:8983/solr。下面通过浏览器面板进行数据导入。

点击solr admin,然后点击中间的Add Core,输入core的相关信息,其中name和instanceDir都与之前建立的文件夹名字相同,其他的不用修改。点击Add Core,一个新的core就建立好了。

在左边的core selector里选择刚刚新建的core,点击下面的DataImport选项,然后在entity里选择data-config.xml里定义的entity,其他的不需要修改。点击Execute执行,如果数据比较多,可能需要的时间会稍长,右边可以查看当前状态。可以勾选下面的Auto-Refresh Status自动更新状态,也可以点Refresh手动查看。等待执行过程完成,索引就建好了。

最后,点击左边的Query选项就可以进行检索了。其中“q”下面的框为查询语句输入框,如我想查询subject字段包含“what”的数据,在查询框输入“subject:what",然后点击下面的Execute Query执行搜索,右边就会显示查询结果。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值