一、需求
有这样一个表:
需要根据关键字“上下班”搜索数据,我们用SQL实现的做法通常是这样的:
SELECT * FROM `t_test` WHERE title LIKE '%上下班%';
但是如果要把desc字段也加进去呢?
SELECT * FROM `lv_travel` WHERE title LIKE '%上下班%' OR descr LIKE '%上下班%';
如果我有三四个这样的字段呢?会有更多的LIKE,有更多的LIKE意味着低的效率,更大的数据库开支。
并且关键是有很多业务需求无法实现,例如要查询关键字“大慈大悲”,不但要包含“大慈大悲”这个几个字查询处理,包含“大慈”关键字的也要查询出来,包含“大悲”的也要查询出来,这就是LIKE模糊查询无法实现的。
缺点很明显:
- 模糊查询性能极低,当数据量庞大的时候,往往会使数据库服务中断;
- 数据库开支非常大;
- 效率很低;
- 不能复用(除非做缓存)
- 无法实现更为复杂的查询;
因此,需要搭建专门提供搜索功能的服务,具备分词、全文检索等高级功能。 Solr 就是这样一款搜索引擎,可以让你快速搭建适用于自己业务的搜索服务。
二、安装
到官网下载相应的安装包,目前是6.5版本。
solr-6.5.0-src.tgz 2017-03-22 05:42 41M 源码需要自己编译
solr-6.5.0.tgz 2017-03-22 05:42 142M 编译之后的代码,适合Linux
solr-6.5.0.zip 2017-03-22 05:42 143M 编译之后的代码,时候Windows
我们今天要安装的是Windows版本的,因为是第一次用,比较容易上手,熟悉了之后可以转到Linux上去,毕竟正式产品环境肯定是Linux。
下载下来解压之后的目录结构如下:
我们进到bin目录,打开cmd执行命令:solr start
就可以启动solr管理界面了,如图:
Dashboard:仪表盘,显示solr的相关信息
Logging:solr的日志
Core Admin:仓库管理
Java Properties:Java参数配置信息
Thead Dump:线程状态
三、建立索引库
solr管理后台启动之后我们需要建立自己的索引仓库,你可以在管理后台新建一个仓库,如图:
也可以手动复制配置文件,然后做一下改动,重启之后solr会自动加载你的新仓库,我们这里只说第二种方式。首先在solr-6.5.0\server\solr目录下新建一个文件夹名字自定,例如:new_core,然后把solr-6.5.0\server\solr\configsets\basic_configs\conf路径下的所有文件复制到new_core目录下面,如图:
然后重启solr就能看到我们新建的索引仓库了,如图:
选择我们的仓库就会出现以下功能,如图:
四、创建索引
这样还没结束,因为我们的仓库里什么都没有,所以我们需要导入数据到仓库里,接下来就是要吧我们自己数据库里面的数据导入到仓库里并且建立索引,然后才能使用索引进行搜索。这里我们使用的是mysql数据库,其他数据库也大致一样。
- 下载mysql数据库驱动mysql-connector-java-5.1.40-bin.jar放到solr-6.5.0\server\solr-webapp\webapp\WEB-INF\lib目录下面
- 从solr-6.5.0\dist目录复制solr-dataimporthandler-6.5.0.jar和solr-dataimporthandler-extras-6.5.0.jar两个jar到solr-6.5.0\server\solr-webapp\webapp\WEB-INF\lib目录下面
然后对solrconfig.xml文件进行配置:
修改索引文件目录
<dataDir>${solr.data.dir:E:\data\solr_home\shangpin}</dataDir>
指定我们数据库导入的配置文件(6.5默认有这个节点就不需要添加了,除非自己需要修改配置文件名称,否则不需要改动)
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">dataimport-config.xml</str>
</lst>
</requestHandler>
既然指定了数据库导入的配置文件路径和名称那接下来就需要对数据库配置文件dataimport-config.xml进行配置了
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource
name="name1"
type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.31.211:3306/mytest"
user="root"
password="123456" />
<document name="goodsDoc">
<entity dataSource="name1" name="t_goods" pk="id"
query="select id,title,subtitle,(select title from t_category c where c.id=g.categoryId) as category from t_goods g where g.state = 1">
<field column="id" name="id"/>
<field column="title" name="title"/>
<field column="subtitle" name="subtitle"/>
<field column="category" name="category"/>
</entity>
</document>
</dataConfig>
这个配置大家应该一看就懂吧,把数据库字段影射为solr属性,要注意两个name1的名称要一样,因为在这个配置文件里是可以配置多个数据源的,更复杂的配置可以参考官方文档。
在导入数据之前我们还需要配置索引映射文件,在6.0之前可以手动在schema.xml里面配置,6.5的时候需要在管理后台手动配置,如图:
相对应的,solr会在solr-6.5.0\server\solr\new_core\conf生成一个managed-schema配置文件,这个文件里记录了索引映射的关系。
首先,需要了解 Solr 中的两个概念: 字段(field) 和 字段类型(fieldType),如图:
field 指定一个字段的名称、是否索引/存储和字段类型。
fieldType 指定一个字段类型的名称以及在查询/索引的时候可能用到的分词插件。
default 指定一个默认值
并且你在dataimport-config.xml中配置了几个字段相应的就需要在后台的Schema中配置几个字段:
这样才能建立好对应关系。
五、导入数据
接下来就需要从数据库导入数据了,如图:
选择Dataimport菜单,然后选择full-import命令,entity选择你刚才在dataimport-config.xml配置的entity name然后点击Execute就可以了,导入之后点击 Overview菜单查看:
如果红框的地方不为0说明正常导入了,接下来就可以试一下查询了,点击Query菜单:
点击Execute Query就能看到全部查询结果:
然后我们可以试着做简单的条件过滤:
本篇就到此结束了,接下来将去学习solr的查询。
相关问题:
Solr 6.0 没有schema.xml未自动创建schema文件
参考资料:
http://www.jianshu.com/p/3d64412f8c40
https://my.oschina.net/helloworld1991/blog/717948
Solr中配置文件schema.xml之copyField 与multiValued用途
http://www.kailing.pub/article/index/arcid/149.html
http://blog.csdn.net/zrl0506/article/details/64922759