solr在windows下的安装及配置
1、solr简介
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
2、倒排索引
有的人会疑惑,搜索通过数据库也能直接查到为什么还要solr这类搜索引擎。例如我现在要搜索"solr"相关的内容,通过数据库模糊匹配%solr%可以查到,数量少的话查询速度还挺可观,如果数据量到达百万级千万级甚至更多,可能查出来得猴年马月了。
而solr用的倒排索引可以解决这一问题。
什么是倒排索引,先说下正排索引。
假如我有部分数据
| 文档id | 文档内容 |
|---|---|
| 1 | solr的使用以及如何在java中使用solr实现搜索功能 |
| 2 | solr是一个独立的企业级搜索应用服务器 |
| 3 | 倒排索引和正排索引 |
| 4 | 搜索引擎 |
假如我要搜索solr,通过正排索引就是文档id作为索引,找到内容包含solr的文档。文档数量多了之后极大增加的搜索时间。
而倒排索引是将文档内容分词后建立索引。
| 单词内容 | 文档id |
|---|---|
| solr | 1,2 |
| java | 1 |
| 搜索 | 1,2,4 |
| 索引 | 3 |
| 服务器 | 2 |
此时我要搜索solr时直接通过单词内容索引,找到文档id列表,在按照文档出现的频次等内容计算权重然后返回。
3、solr在windows下的安装与配置
3.1solr的下载和安装
前往官网下载solr,下载的版本是solr7.7.2 http://lucene.apache.org/solr/
解压后进入cmd进入bin目录执行 solr start命令,命令行显示如下,启动成功,默认端口8983,也可通过-p指定端口启动
例:
开启指定端口服务,默认8983。
solr start -p 8984
重启指定服务
solr restart -p 8983
关闭指定服务
solr stop -p 8983
此时可以打开solr管理页面,浏览器输入http://localhost:8983/solr
3.2solr core的创建
core就是solr的一个实例,一个solr服务下可以有多个core,每个core下都有自己的索引库和与之相应的配置文件。命令行和管理页面都可以创建core,在这我通过命令行创建。
在命令行输入solr create -c "自定义core_name",如图创建成功。
例:
solr create -c "core_name"
3.3导入数据
- 配置数据源
在mysql中添加表和数据,在这里我新增了表city,并添加了一些城市的数据。
sql文件(部分地区数据):
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`city` varchar(255) DEFAULT NULL,
`pid` int(20) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
INSERT INTO `city` VALUES (\'1\', \'北京\', \'10\');
INSERT INTO `city` VALUES (\'2\', \'鄂州\', \'711\');
INSERT INTO `city` VALUES (\'3\', \'恩施\', \'718\');
INSERT INTO `city` VALUES (\'4\', \'黄冈\', \'713\');
INSERT INTO `city` VALUES (\'5\', \'黄石\', \'714\');
INSERT INTO `city` VALUES (\'6\', \'荆门\', \'724\');
INSERT INTO `city` VALUES (\'7\', \'荆州\', \'716\');
INSERT INTO `city` VALUES (\'8\', \'十堰\', \'719\');
INSERT INTO `city` VALUES (\'9\', \'随州\', \'722\');
INSERT INTO `city` VALUES (\'10\', \'武汉\', \'27\');
INSERT INTO `city` VALUES (\'11\', \'咸宁\', \'715\');
INSERT INTO `city` VALUES (\'12\', \'襄樊\', \'710\');
INSERT INTO `city` VALUES (\'13\', \'孝感\', \'712\');
INSERT INTO `city` VALUES (\'14\', \'宜昌\', \'717\');
INSERT INTO `city` VALUES (\'15\', \'潮州\', \'768\');
INSERT INTO `city` VALUES (\'16\', \'东莞\', \'769\');
INSERT INTO `city` VALUES (\'17\', \'佛山\', \'757\');
INSERT INTO `city` VALUES (\'18\', \'广州\', \'20\');
INSERT INTO `city` VALUES (\'19\', \'河源\', \'762\');
INSERT INTO `city` VALUES (\'20\', \'惠州\', \'752\');
INSERT INTO `city` VALUES (\'21\', \'江门\', \'750\');
INSERT INTO `city` VALUES (\'22\', \'揭阳\', \'663\');
INSERT INTO `city` VALUES (\'23\', \'茂名\', \'668\');
INSERT INTO `city` VALUES (\'24\', \'梅州\', \'753\');
INSERT INTO `city` VALUES (\'25\', \'清远\', \'763\');
INSERT INTO `city` VALUES (\'26\', \'汕头\', \'754\');
INSERT INTO `city` VALUES (\'27\', \'汕尾\', \'660\');
INSERT INTO `city` VALUES (\'28\', \'韶关\', \'751\');
INSERT INTO `city` VALUES (\'29\', \'阳江\', \'662\');
INSERT INTO `city` VALUES (\'30\', \'云浮\', \'766\');
INSERT INTO `city` VALUES (\'31\', \'湛江\', \'759\');
INSERT INTO `city` VALUES (\'32\', \'肇庆\', \'758\');
INSERT INTO `city` VALUES (\'33\', \'中山\', \'760\');
INSERT INTO `city` VALUES (\'34\', \'珠海\', \'756\');
INSERT INTO `city` VALUES (\'35\', \'上海\', \'21\');
INSERT INTO `city` VALUES (\'36\', \'巴中 \', \'827\');
INSERT INTO `city` VALUES (\'37\', \'成都\', \'28\');
在\server\solr\test_core(自定义的core名)\conf下新建dataConfig.xml (名字可以自己取)。
标签释义简介:
dataSource:数据库连接的基本配置
entity:数据库中的表
field:表中字段与下文中配置的schema字段一致。
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/my_test"
user="root" password="root"/>
<document>
<entity name="city" query="select cid,city,pid from city">
<field column="cid" name="cid"/>
<field column="city" name="city"/>
<field column="pid" name="pid"/>
</entity>
</document>
</dataConfig>
注意:mysql因为版本问题可能查询不到,自己使用的问题将URL增加为
url="jdbc:mysql://localhost:3306/my_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT"
- 配置schema
schema是用来告诉solr如何建立索引的,它的配置围绕着一个schema配置文件,这个配置文件决定着solr如何建立索引,每个字段的数据类型,分词方式等,新版本的schema配置文件的名字叫做managed-schema。
里面标签简介:
fieldType:为field定义类型,最主要作用是定义分词器,分词器决定着如何从文档中检索关键字。
analyzer:他是fieldType下的子元素,分词器。
filed:创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed属性为true,stored属性为true表示存储该索引。
filed:创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed属性为true,stored属性为true表示存储该索引。
<field name="cid" type="pint" indexed="true" stored="true"/>
<field name="city" type="string" indexed="true" stored="true"/>
<field name="pid" type="pint" indexed="true" stored="true"/>
在\server\solr\test_core(自定义的core名)\conf下打开managed-schema
注意:放在schema标签内。
- 配置数据导入处理器
在\server\solr\test_core(自定义的core名)\conf下打开solrconfig.xml。添加以下内容,dataConfig,xml即为上文中配置的数据源。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<!-- 配置文件的路径应该也可以使用绝对路径 -->
<str name="config">dataConfig.xml</str>
</lst>
</requestHandler>
注意:和
- 导入jar包
数据库驱动的jar:mysql-connector-java-8.0.11.jar (注意这里jar包的版本要根据你数据库的版本来我的数据库是mysql8.0)
data-import的jar:在根目录\dist下有这两个包solr-dataimporthandler-7.7.2.jar和solr-dataimporthandler-extras-7.7.2.jar。
复制这三个jar包到\server\solr-webapp\webapp\WEB-INF\lib下
- 导入数据
以上配置结束后重新启动solr(命令行输入solr restart -p 8983)。登录solr管理页面http://localhost:8983/solr,可以看到选择core的时候可以选择之前创建的test_core
选择Dataimport选项,勾选clean、commit、 debug,Entiry选择city,点击Execute
执行成功后可以看见右边记录数,以及response下的具体数据。
关于solr管理平台的其他一些功能这里暂不详述,有兴趣的同学可以自行百度。
3.4查询
选择Query功能,可以查询数据。
3.5分词
至此基本的查询已经实现了,但还没实现分词效果。
通过分词分析器可以看出这一句话没有分词。
配置ik分词器。下载ik-analyzer-solr7-7.x.jar,jar下载地址:https://search.maven.org/search?q=com.github.magese 放入\server\solr-webapp\webapp\WEB-INF\lib中。
然后在WEB-INF文件夹下新建一个"classes"文件目录,从ik-analyzer-solr7-7.x.jar中找到配置文件IKAnalyzer.cfg.xml中复制到classes目录下。(我是从jar包解压获取的)到classes目录下。然后配置managed-schema中添加ik分词器的配置,并且把field city的类型改为ik_word这样搜索的时候才会应用分词。
<fieldType name="ik_word" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
重启solr,打开管理界面分词分析,可以看到一句话被分成了好几个单词。
查询界面用这句话查询,可以看出查到了重庆市和北京市这两个记录。
至此分词查询也告一段落,下一章会和大家一起看看在java中使用solr。
4、相关问题Q&A
- Q:在Dataimport的页面下导入数据时,一直导入不成功,也看不到报错信息。
A:勾选下列dubug选项,执行。右边会有具体报错信息,Unable to load authentication plugin \'caching_sha2_password\'。
mysql-5.7版本是:default_authentication_plugin=mysql_native_password ,mysql-8.x版本是:default_authentication_plugin=caching_sha2_password
而mysql-connector-java-5.7.jar的版本识别不了mysql_native_password的密码规则,替换jar包为8.0.11即可。