最近一个人无聊搞搜索
如果对上亿条数据进行全文本搜索,使用sql语句肯定是不行的,时间非常差。我尝试了对10w条数据进行检索,1秒。mysql数据库+i7。所以对于海量数据的全文本检索肯定是不行的,然后找啊找。就发现了有搜索引擎这种东西。主流的有sphinx和solr。在这篇文章上有它们之间的比较。
最后选定了solr,因为刚开始学习搜索引擎,当然是资源多的比较好入门啦。sphinx的性能很好,但是资源太少了,百度出来的相关内容就两页。所以还是先从solr入手。
网上很多教程,但是呢,很多人写的很水,因为很多人都是抄袭的,根本就没有自己做过,有什么问题都不清楚。所以我在这里就写多一篇,如果大家觉得有用就看看吧,没用的话我就当是自己的笔记。
我的系统是MacOs,如果你的是linux或者是windows的也可以看,其实都差不多的,只是路径有点区别。
我选用的是solr6.5.0 + Tomcat8.0
切记,如果用Solr6的话最好用Tomcat8 要不然你会后悔的
因为tomcat7上的javax-servlet和Solr6的jar包冲突了!所以,如果你想用tomcat7的话就老老实实的用Solr5。解决的方法也有,但是太浪费时间,所以我选择把时间花在Solr的学习上。
- 安装
如果是mac的话,直接在终端上输入 brew install solr
然后等待安装完成。如果brew指令不存在,那就是你没有安装brewhome,百度一下brew的安装方法。
如果是windows的话就上Solr官网下载。
2.启动
安装完成后启动solr solr star
返回以下文字提示,则表示 solr 服务器安装成功,默认监听的端口号为 8983:
Waiting up to 30 seconds to see Solr running on port 8983 [\]
Started Solr server on port 8983 (pid=890). Happy searching!
在浏览器中访问
Solr 提供了可视化管理界面Solr Admin,默认的访问URL为: http://localhost:8983/solr/
3.创建核心。
终端输入 solr create -c test test:核心的名字
会发现多了一个test文件夹。在http://localhost:8983/solr/的Core Selector也可以选择test核心
4.链接数据库进行查询。
首先安装好mysql。别的数据库也行,就是配置data-config.xml 有点不同而已。
然后添加以下数据
create table goods(id int not null auto_increment, name varchar(20) not null default '', number varchar(20) not null default '', updateTime timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, primary key(id));
insert into goods(name, number) values('鞋子', 100);
insert into goods(name, number) values('衣服', 200);
insert into goods(name, number) values('裤子', 300);
添加完成后,这里要配置的主要就三个文件。
/solr/6.5.0/serever/solr/test/conf/solrconfig.xml
/solr/6.5.0/serever/solr/test/conf/managed-schema
/solr/6.5.0/serever/solr/test/conf/data-config.xml (这个没有的话要新建)
5.配置solrconfig.xml
首先,把mysql-connector-java-5.0.8-bin.jar
solr-dataimporthandler-6.5.0.jar
solr-dataimporthandler-extras-6.5.0.jar
放入 /solr/6.5.0/libexec/dist 内,
然后修改 solrconfig.xml
加入:
<lib dir="${solr.install.dir}/libexec/dist/" regex="mysql-connector-java-5.0.8-bin.jar" />(这里我用5.1.7的时候报错,所以改成5.0.8)
<lib dir="${solr.install.dir}/libexec/dist/" regex="solr-dataimporthandler-.*\.jar" />
6.添加 MySQL 配置信息
在<requestHandler name="/select" class="solr.SearchHandler">的前面添加以下信息:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
然后修改data-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source1"
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mariadb"
user="root"
password="123456"
batchSize="-1"/>
<document>
<entity name="goods"
pk="id"
dataSource="source1"
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>
url="jdbc:mysql://localhost:3306/mariadb"
user="root"
password="123456"
最后修改managed-shema添加
<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="false" />
最后重启:solr restart
7.查询
Entity选择 goods
然后点击Execute就可以添加索引
点击Execute Query就可以搜索了。
部署到tomcat的话在下一篇文章讲。