前面已经介绍了solr-5.5.0的安装与部署,接下来我将分享solr-5.5.0数据导入之从数据库中导入数据并建立索引的例子。由于本人也是刚刚接触solr,不足之处,请大家多多见谅。solr和lucene版本更新太快了,版本之间的差异十分大。比如之前的版本中,在core中使用schema.xml作为根描述文件,在solr5.5中使用的是叫做managed-schema作为描述文件。这个本人在这个问题上困扰很久,因为之前的资料都有一个叫做schema.xml的文件,并且在新建core的时候solr管理界面也会提示需要这么一个文件。在这里我已经认为你安装好了solr如果还有不清楚的可以参考文章:“solr5.5.0在CenOS上的安装与配置”
1. 新建一个数据表,这里我选择的是mysql数据库,具体如何安装我这里就不说了,具体代码如下。这里还需要mysql的驱动包,需要放入到/opt/tomcat6/lib目录下,或者放到/opt/tomcat6/webapps/solr/WEB-INF/lib目录下,自行去mysql官网下载jdbc驱动包,在数据导入的时候需要用到:
mysql> use test Database changed
#创建一个名为goods的数据表: mysql> create table goods( ID INT(11) PRIMARY KEY, NAME VARCHAR(50), URL VARCHAR(128), PRICE FLOAT, ADDTIME DATETIME); Query OK, 0 rows affected (0.07 sec)
#向该数据表中插入3条记录: mysql> insert into goods(ID,NAME,URL,PRICE,ADDTIME) values(1,'苹果','www.baidu.com',4.5,'2016/4/9 16:46:22'); Query OK, 1 row affected (0.06 sec) mysql> insert into goods(ID,NAME,URL,PRICE,ADDTIME) values(2,'香蕉','www.sina.com',2.5,'2016/4/9 16:47:37'); Query OK, 1 row affected (0.00 sec) mysql> insert into goods(ID,NAME,URL,PRICE,ADDTIME) values(3,'香橙','www.google.com',10,'2016/4/9 16:48:37'); Query OK, 1 row affected (0.00 sec) mysql> select * from goods -> ; +----+--------+----------------+-------+---------------------+ | ID | NAME | URL | PRICE | ADDTIME | +----+--------+----------------+-------+---------------------+ | 1 | 苹果 | www.baidu.com | 4.5 | 2016-04-09 16:46:22 | | 2 | 香蕉 | www.sina.com | 2.5 | 2016-04-09 16:47:37 | | 3 | 香橙 | www.google.com | 10 | 2016-04-09 16:48:37 | +----+--------+----------------+-------+---------------------+ 3 rows in set (0.00 sec)
2.1 进入solrhome,在solrhome文件下新建一个一个叫做mynode的文件
进入solrhome,并查看其文件结构 [root@localhost /]# cd /opt/tomcat6/solrhome [root@localhost solrhome]# ls configsets README.txt solr.xml zoo.cfg [root@localhost solrhome]# mkdir mynode [root@localhost solrhome]# ls configsets mynode README.txt solr.xml zoo.cfg
[root@localhost solrhome]# mkdir ./mynode/conf
[root@localhost solrhome]# cd configsets [root@localhost configsets]# ls basic_configs data_driven_schema_configs sample_techproducts_configs [root@localhost configsets]# cd data_driven_schema_configs [root@localhost data_driven_schema_configs]# ls conf [root@localhost data_driven_schema_configs]# ls conf currency.xml lang params.json solrconfig.xml synonyms.txt elevate.xml managed-schema protwords.txt stopwords.txt2.4 将/opt/tomcat6/solrhome/configsets/data_driven_schema_configs/conf/conf/目录下的所有文件复制到/opt/tomcat6/solrhome/mynode/conf目录下
[root@localhost data_driven_schema_configs]# cp -r ./conf/* ../../mynode/conf/ [root@localhost data_driven_schema_configs]# cd ../../mynode/conf [root@localhost conf]# ls currency.xml lang params.json solrconfig.xml synonyms.txt elevate.xml managed-schema protwords.txt stopwords.txt
将/opt/solr550/example/example-DIH/solr/db/conf/目录下的admin-extra.html 、admin-extra.menu-bottom.html 、 admin-extra.menu-top.html 三个html文件复制到 /opt/tomcat6/solrhome/mynode/conf/目录下
[root@localhost conf]# cp -r /opt/solr550/example/example-DIH/solr/db/conf/admin*.html /opt/tomcat6/solrhome/mynode/conf/
[root@localhost conf]# vim solrconfig.xml
<requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>data-config.xml文件是自己制定的数据源描述文件,名字可以随便取
2.6 在/opt/tomcat6/solrhome/mynode/conf目录下新建一个data-config.xml文件,并添加如下内容:
<pre name="code" class="plain"><dataConfig> <dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8" password="znp@mm" user="root"> <document> <entity name="goods" dataSource="source1" query="select * from goods"
deltaImportQuery="select * from goods where ID='${dataimporter.delta.ID}'"
deltaQuery="select ID from goods where ADDTIME>'${dataimporter.last_index_time}'"> <field column="ID" name="id"/> <field column="PRICE" name="price" /> <field column="NAME" name="name" /> <field column="URL" name="url" /> <field column="ADDTIME" name="addtime" /> </entity> </document> </dataSource> </dataConfig>
注意:
goods是实体名称
colunm:对应的是数据库中表字段名称
query:就是full-import导入的查询语句
deltaQuery:增量查询语句
deltaImportQuery:delta-import导入的查询语句
细心的你会发现url="mysql:jdbc://localhost:3306/test?useUnicode=true &characterEncoding=utf-8",这儿用的&而不用&作为参数的链接符,因为这个会报错,笔者在这儿困惑了很久,找了很久才找到答案。也就是有人说的使用参数中不能够使用&的解决办法。
2.7 在managed-schema文件中添加如下内容:
[root@localhost conf]# vim managed-schema
<field name="name" type="string" indexed="true" stored="true" /> <field name="price" type="float" indexed="true" stored="true" /> <field name="url" type="string" indexed="true" stored="true" /> <field name="addtime" type="date" indexed="true" stored="true" />
2.9 设置好之后,点击Add Core按钮,进行设置,设置成功后,再core Selector选择刚刚添加的core
选择刚刚添加的goods实体进行索引操作:我们这儿可以选择full-import或者delta-import(增量索引),选择增量索引需要把clean的勾给去掉,不然会清除之前的,增量的索引的初衷是对新增或者修改的记录重新索引,会追加到原有的索引文件当中。当我们选择full-import的时候,最好就是把原有的索引文件给清空重新索引。
显示indexing......,正在索引:
索引成功如下如所示:
使用query进行测试,输入香蕉查出了香蕉和香橙
这里给大家留了一个坑,就是中文乱码的问题,当时我在弄的时候出现了这个问题,就是mysql默认的编码格式是latin1,需要我们修改成utf-8,数据库在创建的时候也需要指定编码格式为utf-8,因为本人少有使用命令的方式创建数据库,所以犯了如下错误,具体解决办法请大家自行摸索:
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
正确的编码格式:
mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+