Solr7.3.1学习(一)
由于项目中用到了全文检索系统,就找到了solr,参考了很多教程和官方文档,记录一下。
软件环境
- solr7.3.1
- JDK8 32位
- windows xp
- oracle11g
下载和启动
solr是一个单独的系统,部署在web容器中。solr7.3.1 不再提供war包,内部集成了jetty,也可以将webapp内容拷贝到tomcat中,这里直接用内置的jetty采用单节点单核心模式。
- 在官网下载solr7.3.1
- 解压下载的zip文件,建议路径全英文
- 进入根目录下bin文件夹,复制路径。
- 打开cmd键入命令
cd C:\Program Files\MYJAVA\test\solr-7.3.1\bin
solr start -p 8983
出现红框中字样代表启动成功,命令中的8983是指定端口启动,访问localhost:8983/solr
出现下面图片,没有红色的错误信息。这样solr就已经启动,接下来配置核心和导入数据库配置。
核心配置
- 建立核心(
core
)
核心的概念个人理解相当于数据库,用来存放索引的。多核心可以对应不同的表数据,也可以单核心存放,这里使用的是单核心。
- 打开新
cmd
窗口,键入命令cd C:\Program Files\MYJAVA\test\solr-7.3.1\bin
- 执行
solr create -c coreName
其中coreName
对应核心的名称,这里是testCore
- 打开
C:\Program Files\MYJAVA\test\solr-7.3.1\server\solr
可以看到testCore文件夹已经创建
- 打开新
配置solr的核心
主要是配置核心文件夹testCore\conf
下的managed-schema
,solrconfig.xml
和 数据库导入文件dataImport.xml
(可自定义名称)。引入中文分词器
便于全文检索时对中文关键词进行拆分。这里选用
IKanlyzer
分词器 点击下载将下载好的jar包放入
solr-7.3.1/server/solr-webapp/webapp/WEB-INF/lib
目录中
修改
managed-schema
文件,在最后一行加入如下代码:<!-- ik分词器 --> <fieldType name="text_ik" 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>
如图:
引入数据库导入插件
- 复制
C:\Program Files\MYJAVA\test\solr-7.3.1\dist
目录下的
solr-dataimporthandler-extras-7.3.1.jar
和solr-dataimporthandler-7.3.1.jar
以及对应数据库驱动(这里使用oracle)ojdbc6-11.2.0.4.jar
到C:\Program Files\MYJAVA\test\solr-7.3.1\server\solr-webapp\webapp\WEB-INF\lib
目录下 修改
solrconfig.xml
文件,在最后一行加入一下代码:<!-- 数据库导入 --> <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <!-- 数据源配置文件名自定义 --> <str name="config">dataImport.xml</str> </lst> </requestHandler>
在
testCore\conf
下新建dataImport.xml
名称与solrconfig.xml
配置中相对应(如上图)需要分词的字段则type="text_ik"
,这就是刚才配置的ik分词器。
dataImport.xml
中就是对应的数据库导入参数(如下):
<dataConfig>
标签下填写具体的数据库链接参数,可以配置多个数据库,用name
来唯一区分。
<document>
标签就是具体导入信息。里面一个<entity>
代表一个实体,对应数据一张表格,可以多实体嵌套,具体参考官方文档。
<entity>
下的pk
属性代表此表唯一的主键
<entity>
下的transformer
属性代表开启自动转换数据库text
clob
类型字段
<entity>
下的query
属性代表此表初次导入和全量导入的sql
<entity>
下的deltaQuery
属性代表此表增量导入的id,注意只查询id
<entity>
下的deltaImportQuery
属性代表此表增量导入的sql,会使用查询出query
的id
<entity>
下的deletedPkQuery
属性代表此表删除的sql,注意只查询id
<field>
表示要导入的字段信息,clumn
对应数据库字段,name
对应managed-schema
自己增加字段
**以上是官方文档说明。我这里增量导入无效,暂时没有找到具体解决方法
- 复制
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource name="oracle" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:orcl" user="root" password="root"/>
<document>
<entity name="openInfo"
pk="openId"
transformer="ClobTransformer"
query="SELECT 'openInfo' INFOTYPE,CONCAT('openInfo_', a.ID) TID,a.* FROM OPENINFO a where a.DELSTATE=0 AND a.OPENSTATE='3'"
deltaQuery="SELECT ID FROM OPENINFO where DELSTATE=0 AND OPENSTATE='3' AND RECORDCREATETIME > '${dataimporter.openInfo.last_index_time}'"
deltaImportQuery="SELECT 'openInfo' INFOTYPE,a.* FROM OPENINFO a where a.id='${dih.delta.openId}'"
deletedPkQuery="select ID from OPENINFO where DELSTATE=1" >
<field column="TID" name="id" />
<field column="ID" name="openId" />
<field column="TITLE" name="title" />
<field column="CONTEXT" name="content" clob="true" />
<field column="ISSUENUM" name="issueNum" />
<field column="ISSUEAGENCY" name="issueAgency" />
<field column="INFOTYPE" name="type" />
<field column="RECORDCREATETIME" name="createDate" />
</entity>
</document>
</dataConfig>
配置完成,启动测试
启动solr出现以下画面,则启动成功
点击左侧的 选择新建的核心,点击anlysis输入中文词汇,选择配置的ik分词器,点击AnlyseValue 下方出现分词结果,则配置分词成功
导入数据库数据,点击Dataimport,勾选红框部分,点击Execute执行
导入成功画面
- 点击Query,Execute Query查询到以下画面,则一个单节点单核心的solr服务器搭建成功!