在平时的开发当中,首先肯定是将数据存在数据库的,所以对数据库数据建立索引很重要,下面废话不多说,进入主题
我们已经建立了solr_home目录,solr_home在项目中我们是用来存储索引的,所以这一篇就从这里开始。
1 创建Core Admin
在webapps中solrhome下新建一个文件夹名字叫做my_core(名字不固定,可以随便取,但是这个名字在后面的配置中会有所关联。)然后在my_core文件下新建一个名字叫做conf的文件夹(这个文件名字最后不要改。)然后把官网下下来的solr项目中solr-6.2.0\server\solr\configsets\data_driven_schema_configs\conf下的所有东西复制到conf中去。(注意不要复制错!)最后把solr-6.2.0\example\example-DIH\solr\db\conf下的admin-extra.html, admin-extra.menu-bottom.html ,admin-extra.menu-top.html三个文件也复制到conf中去。
2 配置相关包及其路径
把mysql所需的jar包和solr-6.2.0\dist下的solr-dataimporthandler-6.2.0.jar和solr-dataimporthandler-extras-6.2.0.jar都复制到项目WEB-INF\lib下。然后在solrconfig.xml文件中加入
1
|
<lib
dir="D:/编程工具/tomcat/apache-tomcat-8.0.32-windows-x64/apache-tomcat-8.0.32/webapps/solr/WEB-INF/lib/"
regex=".*\.jar" />
|
就是把WEB-INF\lib里面的jar包配置到项目中,我这里用的是绝对地址。这段代码大约在solrconfig.xml的75行处,前面有一堆类似的代码。
3 建立数据库表
在MYSQL中新建一张表。我这里的表名叫goods,你也可以自己建,这个没有要求,主要是之后的配置,按数据表配就行了。我的建表语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
CREATE
DATABASE
IF
NOT
EXISTS solr;
USE solr;
DROP
TABLE
IF
EXISTS
`goods`;
CREATE
TABLE
`goods` (
`id`
INT(
11)
NOT
NULL AUTO_INCREMENT,
`name`
VARCHAR(
10)
NOT
NULL,
`number`
INT(
20)
DEFAULT
NULL,
`updateTime`
TIMESTAMP
NULL
DEFAULT
CURRENT_TIMESTAMP,
PRIMARY
KEY (
`id`)
)
ENGINE=
INNODB AUTO_INCREMENT=
5
DEFAULT
CHARSET=utf8;
INSERT
INTO
`goods`(
`id`,
`name`,
`number`,
`updateTime`)
VALUES
(
1,
'商品1',
100,
'2016-11-28 16:48:57'),
(
2,
'商品2',
120,
'2016-11-28 16:48:57'),
(
3,
'商品3',
150,
'2016-11-28 16:48:57'),
(
4,
'手机1',
50,
'2016-11-28 17:44:29');
|
4 添加data-config.xml
在solrconfig.xml的
1
|
<requestHandler name=
"/select"
class=
"solr.SearchHandler">
|
之上添加:
1
2
3
4
5
|
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
|
然后在conf下新建data-config.xml文件。内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml
version="1.0"
encoding="UTF-8"?>
<dataConfig>
<dataSource
name="solrDB"
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/solr?characterEncoding=UTF-8"
user="root"
password="123456"
batchSize="-1" />
<document>
<entity
name="goods"
pk="id"
dataSource="solrDB"
query="select * from goods
"
deltaImportQuery="select * from goods where
id='${dih.delta.id}'"
deltaQuery="select id from goods where updateTime > '${dataimporter.last_index_time}'
">
<field column="id
" name="id
"/>
<field column="name
" name="name
"/>
<field column="number
" name="number
"/>
<field column="updateTime
" name="updateTime
"/>
</entity>
</document>
</dataConfig>
|
解释一下:
dataSource是数据库数据源。Entity就是一张表对应的实体,pk是主键,query是查询语句。Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed的名字。其中solrdata是数据库名,goods是表名。
其中deltaQuery是增量索引,原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。
最后在conf文件下的managed-schema配置field信息:
1
2
3
4
5
6
7
8
9
|
<field
name="id"
type="int"
indexed="true"
stored="true"
required="true"
multiValued="false" />
<field
name="name"
type="string"
indexed="true"
stored="false"/>
<field
name="number"
type="int"
indexed="true"
stored="false"/>
<field
name="updateTime"
type="date"
indexed="true"
stored="true" />
<!--下面三个字段是系统本身不能删除的,删除会报错-->
<field
name="_version_"
type="long"
indexed="true"
stored="false"/>
<field
name="_root_"
type="string"
indexed="true"
stored="false"
docValues="false" />
<field
name="_text_"
type="text_general"
indexed="true"
stored="false"
multiValued="true"/>
|
注意:id,name,number,updateTime是我们上面数据库的字段。下面三个field是系统本身的不能删除,否则会运行错误。
5 测试
启动tomcat,并在URL中输入http://127.0.0.1:8080/solr/index.html 路径。在core Selector选择刚刚添加的core。
选择core
选择刚刚添加的goods实体进行索引操作:我们这儿可以选择full-import或者delta-import(增量索引),选择增量索引需要把clean的勾给去掉,不然会清除之前的,增量的索引的初衷是对新增或者修改的记录重新索引,会追加到原有的索引文件当中。当我们选择full-import的时候,最好就是把原有的索引文件给清空重新索引。
导入数据
这里解释一下这些选项:
full-import:全量导入,它会覆盖原有的索引
delta-import:即增量导入,它会在原有索引的基础上追加
verbose:这个选项设为true的话,会打印导入的一些中间过程的详细信息,有利于调试以及了解内部操作细节
clean:表示是否在导入数据创建索引之前先清空掉原有的索引
commit:表示是否立即提交索引
optimize:表示是否优化索引
debug: 表示是否开启调试模式
索引成功如下如所示:
索引成功
如果你导入的数据并不多,但这个界面停留了很长时间(比如超过了30秒,就不需要再傻傻等着了),那么很有可能数据导入过程出错了,这时,请切换到logging菜单查看solr日志,如图:
导入出错日志
像我这个错误,我也没搞明白是什么错误,google了半天也没找打到一个合理的解答。然后我自己重新下载了mysql的jar包,测试了几个jar包,其中版本mysql-connector-java-5.1.39.jar不会报错。不知道这样是不是根除了这个问题,有知道原因的也可以跟我留言解释一下。
数据导入成功后,我们使用query测试一下,输入关键字查出了想要的结果:
query成功
自此。mysql数据导入solr就顺利完成了