先说说Solr来索引MySQL数据有什么优点~

我们的数据库表有很大的表,每天20w数据插入,表里已经累积了2900w的数据,而业务需求又需要一些比较实时的筛选count,遇到一些复杂的count的话MySQL返回结果都是以秒计算。严重拖慢了整个系统的性能。

所以有了搭建搜索引擎来索引MySQL里数据的需求。

之前虽然翻译了一篇5分钟搭建Solr的教程,然而到了导入MySQL这一步还是遇到了很多坑,泪。

因为Solr本身的文档写得不够美丽(滚,而且在网上搜导入MySQL数据的教程都是要么语焉不详,要么都是用的老版本的Solr,所以悲催地踩了两天坑,才终于搭好了基本功能。

下面做一下简单的记录:

1.安装

wget -c http://mirror.bit.edu.cn/apache/lucene/solr/5.3.1/solr-5.3.1.zip  
unzip solr-5.3.1.zip  
cd solr-5.3.1  
bin/solr start  

像上一篇说的一样,这样就成功启动了~

访问ip:port可以成功访问到solr的admin配置页

2.导入MySQL数据

导入MySQL数据需要MySQL的jdbc驱动,可以自己单独下载,并将jar文件拷贝到solr的dist目录下。

先创建新的core

bin/solr create -c cch  
Setup new core instance directory:  
/root/solr-5.3.1/server/solr/cch

Creating new core 'cch' using command:  
http://localhost:8983/solr/admin/cores?action=CREATE&name=cch&instanceDir=cch

{
  "responseHeader":{
    "status":0,
    "QTime":2820},
  "core":"cch"}

这样就创建了一个以cch命名的core,生成的文件目录在

/{SOLR安装目录}/server/solr/cch

这时候在admin页面上进入core admin,可以看到名为cch的core已经成功创建完成了~

像下面这样:

直接在页面上点Add Core的话会报错,必须用命令行来生成一个新core,这点上还是挺不友好的。所以才说你们这群java程序员哎

这时候在左边栏的下方用Core Selector选中刚才创建的cch的core,选择Dataimport,可以看到

sorry, no dataimport-handler defined!  

然后在admin界面上还没有能让我添加dataimport-handler的地方,再次醉了。

这时候只能手动编辑:

/{SOLR安装目录}/server/solr/cch

添加

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

  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-.*\.jar" />

注意,下面这两个lib是必须引入的,一个用来是solr的数据导入插件,另一个是mysql的jdbc连接插件。

完成之后在Core Admin里选中刚才的core,点击Reload,之后再选择cch的Core,会发现Dataimport标签页已经有页面了,开心!

3.配置文件

当然了,做完上面那些还不算完。

完整的配置项是需要修改

solrconfig.xml  
  => 配置了dataimport操作的配置文件,我们这里指定为
dataconfig.xml  
  => 这个文件名是在solrconfig里指定的,指定了solr在导入数据的时候的MySQL数据源定义,以及文档字段,全量、增量导入时的sql query语句和具体的字段,该文件中的字段在managed-schema里必须要有定义。
managed-schema  
  => 这个文件在老版本中叫schema.xml,新版本中变成了managed-schema,需要留意。在该文件中定义了所有的字段名称、属性、是否索引、是否存储。尽量把作为查询条件和需要的字段设置为stored="true"

下面给出这几个文件的修改样例: solrconfig.xml上面已经列过,这里不再赘述。

dataconfig.xml:

<dataConfig>  
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="root" password=""/>
    <document>
        <entity name="service_worksheet" pk="id"
query="SELECT id, allocation, process_id, channel FROM g_service_worksheet">  
            <field column="id" name="id"/>
            <field column="allocation" name="allocation"/>
            <field column="process_id" name="process_id"/>
            <field column="channel" name="channel"/>
        </entity>
    </document>
</dataConfig>  

managed-schema

...
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />  
<field name="channel" type="int" indexed="true" stored="true"/>  
<field name="process_id" type="int" indexed="true" stored="true"/>  
<field name="allocation" type="int" indexed="true" stored="true"/>  
...
<uniqueKey>id</uniqueKey>  

managed-schema里会自带一个uniqueKey字段,如果你的表的唯一字段不是id,请自行修改,不过一般的表设计规范,自增字段和主键也都是这个id。

你可以以你自己的数据库配置为准,来修改上面的managed-schema,以及dataconfig.xml,需要注意一一对应,如果没有对应的话,可能会在查询的时候出错。

都配置好之后在Core的管理选项里选择Schema Browser,应该可以看到: 刚才添加的字段都可以在下拉列表里看到了,哟西。

这时候再去看看左栏的Logging。

卧槽,怎么还有报错,发现缺少admin-extra.html/admin-extra.menu-bottom.html/admin-extra.menu-top.html这三个文件。这个也很好解决,记得上一篇里的example里的DIH么?正是,去example-DIH目录里,把这三个文件拷贝到你的core目录的conf文件夹下。所以说你们这群java程序员,真是各种给人添麻烦呐

这一次,就基本算是都搞定了。

我们可以去Dataimport选项下开始导数据了。不用修改默认选项,只勾选自动refresh,然后点击execute。然后就能看到solr在飞快地全量导入你的MySQL数据啦!

完成之后可以去Query标签下,进行一些简单的查询了。具体的query语法可以参考这里: https://cwiki.apache.org/confluence/display/solr/The+Standard+Query+Parser

200w的数据,增加几个查询条件,然后查看返回结果。

飞快啊有木有!

之后可以做什么:

  1. 本篇中只介绍了简单的全量导入,需要完成增量导入的话,另外还要配置Solr的dataconfig.xml
  2. 在对MySQL进行CRUD的时候,如果对即时性要求较高,需要直接触发Solr的增量导入和更新接口。
  3. Solr老版本并不支持分布式,这不符合现在所有服务都需要高可用的趋势,没记错的话,为了支持分布式从5这个大版本开始有了SolrCloud。当然,应该也是需要更多的配置。
  4. 研究明白搜索引擎的实现原理,说服推行引入搜索引擎这样的优化方案。

在搭建过程中得到的一些经验:

  1. 如果界面响应正常,但是感觉有错,可以去Logging下查看,一般都是有报错的
  2. schema修改了之后最好去Schema Browser里看一下下拉列表,是否生效,如果没有生效,看一下是不是在conf界面下既有managed-schema又有schema.xml,而两个文件在配置上不一致。如果是的话,请只保留managed-schema。solr会以managed-schema为准,虽然在Logging页面上会显示一个warning说schema.xml也能被load,但那是胡扯。

以上。