为了实现快速查询文章内容,我使用了solr这个搜索服务器。solr的本质是一个非关系型数据库,但是它与数据库有着本质的区别。数据库的主要作用是存储数据,而solr的优势在于搜索,其查询速度非常快。
solr下载与安装
点此在官网下载安装即可
安装后的目录结构如下:
solr启动与关闭
进入bin目录,在cmd中输入
.\solr start
即可开启solr
关闭命令如下
.\solr stop -all
注意一定要加 -all
开启服务后,用浏览器进入http://localhost:8983/solr/#/
即可查看solr界面
创建core文件夹
每一个core代表一个索引库,下面我们尝试建立user和article这两个core
在bin目录下,输入如下命令
.\solr create -c corename
其中corename为要创建的core的名称,比如我们创建user,创建完成后,打开文件夹.\server\solr可以看到下面多了一个user文件夹,就是我们刚才创建的core。
solr界面上也可以找到user
关于core的详细信息,可以参照这个博客:https://blog.csdn.net/sswqzx/article/details/84501215
连接数据库
mysql
连接mysql数据库相对来说是比较简单的
- 添加驱动依赖包
将mysql驱动依赖包添加到.\server\solr-webapp\webapp\WEB-INF\lib中,
这里我用的是mysql-connector-java-8.0.23.jar - 配置dataimporthandler相关包
找到.\dist下的solr-dataimporthandler-7.7.3.jar和solr-dataimporthandler-extras-7.7.3.jar两个包,把他们复制到.\server\solr-webapp\webapp\WEB-INF\lib目录下
- 添加数据库配置
找到.\server\solr\corename\conf下的solrconfig.xml并添加配置
<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数据库连接配置
在目录.\server\solr\corename\conf下新建一个文件data-config.xml并添加如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/***"
user="***"
password="***" />
<document>
<entity name="userEntity" query="select
uid,
username,
password
from user">
<field column="uid" name="user_id"/>
<field column="username" name="user_name"/>
<field column="password" name="user_password"/>
</entity>
</document>
</dataConfig>
数据库的用户名和密码,数据库名称改成自己所需的内容
query需要输入想要查询的内容
field中的column字段为数据库中的字段名称,name字段可以自定义,是solr字段的名称
- 配置managed-schema
打开文件.\server\solr\corename\conf下的managed-schema,并在其中的标签里面添加如下配置:
<field name="user_id" type="string" indexed="true" stored="true"/>
<field name="user_name" type="string" indexed="true" stored="true"/>
<field name="user_password" type="string" indexed="true" stored="true"/>
注意: name字段必须和userEntity中的name字段相同
- 导入数据
在solr中选定上图的内容后,点击execute
refresh后,
左侧选择query,查询导入的数据
mongodb
mongodb数据导入到solr中,可以有两种方法
①使用mongo-connector
②使用solr-mongo-dataimport
这里我们使用solr-mongo-dataimport
以导入article为例
- 文件配置
在./server/solr-webapp/webapp/WEB-INF/lib中导入如下jar包:- solr-dataimporthandler-7.7.3.jar和solr-dataimporthandler-extras-7.7.3.jar
- mongo驱动包,我用的是mongo-java-driver-3.2.2.jar
- solr-mongo-import.jar 点此下载
- SolrMongoImporter.jar 下载地址:https://github.com/jbonch/SolrMongoImporter
- 配置solrconfig.xml
与上面mysql不同的是,需要添加以下内容:
<lib dir="./lib/" regex="SolrMongoImporter.*\.jar"/>
<lib dir="./lib/" regex="mongo-java-driver.*\.jar"/>
否则jar包不能正常识别
再添加和上面相同的内容
<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="MongoSource"
type="MongoDataSource"
database="***"
host="***"
port="***"/>
<document>
<entity name="Article"
processor="MongoEntityProcessor"
query="{'bookname':'111'}"
collection="article"
datasource="MongoSource"
transformer="MongoMapperTransformer"
mapMongoFields="true">
<field column="article_id" name="article_id" mongoField="_id"/>
<field column="article_title" name="article_title" mongoField="title"/>
<field column="article_bookname" name="article_bookname" mongoField="bookname"/>
<field column="article_articleAuthor" name="article_articleAuthor" mongoField="articleAuthor"/>
<field column="article_content" name="article_content" mongoField="content"/>
<field column="article_imgurl" name="article_imgurl" mongoField="imgurl"/>
<field column="article_notes" name="article_notes" mongoField="notes"/>
<field column="article_XML" name="article_XML" mongoField="XML"/>
<field column="article_annotation" name="article_annotation" mongoField="annotation"/>
<field column="article_page" name="article_page" mongoField="page"/>
</entity>
</document>
</dataConfig>
database是要导入的数据库名称,host和port按需输入即可
query必须是json格式
field中细节与上面不同,column和name的内容无所谓,但是mongoField既要与数据库中的字段相同,也要与managed-schema中的name相同
- 配置managed-schema
<field name="_id" type="string" indexed="true" stored="true" />
<field name="title" type="string" indexed="true" stored="true"/>
<field name="bookname" type="string" indexed="true" stored="true"/>
<field name="articleAuthor" type="string" indexed="true" stored="true"/>
<field name="content" type="string" indexed="true" stored="true"/>
<field name="imgurl" type="string" indexed="true" stored="true"/>
<field name="notes" type="string" indexed="true" stored="true"/>
<field name="XML" type="string" indexed="true" stored="true"/>
<field name="annotation" type="string" indexed="true" stored="true"/>
<field name="page" type="string" indexed="true" stored="true"/>
name必须与mongoField相同
- 导入数据
导入方法与mysql相同,查询结果如下: