主要记录一下以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执行搜索,右边就会显示查询结果。