篇首语:本文由编程笔记#小编为大家整理,主要介绍了solr 7+tomcat 8 + mysql实现solr 7基本使用(安装集成中文分词器定时同步数据库数据以及项目集成)相关的知识,希望对你有一定的参考价值。
Solr自带集成jetty,但是一般都不直接使用,而是将solr另外和tomcat或jetty服务器集成到一起,形成搜索引擎。
Solr 7解压后的目录:
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACEweb-resource-name>
<url-pattern>/url-pattern>
<http-method>TRACEhttp-method>
web-resource-collection>
<auth-constraint/>
security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACEweb-resource-name>
<url-pattern>/url-pattern>
<http-method-omission>TRACEhttp-method-omission>
web-resource-collection>
security-constraint>
solr-home是solr的核心目录,主要的配置文件,索引以及基本数据的保存,插件和数据库的集成都是在此目录下进行配置。
到此solr的基本搭建结束,可以启动tomcat检查solr是否已经安装成功。
查看安装成功:
每个实例对应一个core,这内部存储的就是当前core下的所有配置文件,这个的core可以创建多个。创建过程:
在早期版本solr集成的中文分词器都是IK,IK分词器是国产的开源项目,但是在2012年后IK分词器就停止了更新,但是Lucene和solr的版本不断的在迭代,IK分词器也不能很好的支持,虽然有人对其进行改写,但是有点坑,这里放弃使用IK,还好solr6以后就有自带的中文分词器,也是比较好用,下面以此为例。
<fieldType name="text_ik" class="solr.TextField" positiOnIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
analyzer>
fieldType>
<field name="solrKey" type="text_ik" indexed="true" stored="false" multiValued="true"/>
集成很简单,重新启动tomcat,进入到实例core下,查看schema是否已经配置成功。
检验集成后的结果:
图片内容分析:
选择刚创建的core,采用模拟分词analysis,输入中文内容,左边表示需要建立索引的字段值,右边表示需要搜索的内容,分析字段选择solrKey,因为在所有字段中,只有solrKey使用了中文分词器,在分析处理的结果显示,”帅哥”两个字已经匹配到。
solr是作为一个搜索引擎,为什么不直接使用数据库来实现搜索,对于这种搜索都是采用的模糊查询(like %关键字%),在使用like查询的时候,如果关键字前面加上%就会导致查询不会走索引,也就意味着建立索引也是白搭,另外随着数据的增长,这种搜索的效率会很低,在插入更新数据的时候,索引的维护也会影响操作效率,所有一般都会使用第三方搜索工具,solr就是其中之一。为了将数据库数据同步到solr中,这里就会将solr和数据库建立连接,从数据库中同步数据到solr中。
这里的solr.install.dir表示的是当前solrconfig.xml所在的conf目录,第一步将contrib、dist复制到solr-home下,和conf差一级目录,所有solr.install.dir后加的是../,但是实际情况实际分析去修改../。
<lib dir="${solr.install.dir:../}/contrib/dataimporthandler/lib" regex=".*\\.jar" />
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xmlstr>
lst>
requestHandler>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="root"/>
<document>
<entity name="userInfo" query="SELECT ID,USER_NAME,SOLR_KEY FROM USER_INFO ">
<field column="ID" name="id"/>
<field column="USER_NAME" name="userName"/>
<field column="SOLR_KEY" name="solrKey"/>
<field column="UPDATE_TIME" name="updateTime"/>
entity>
document>
dataConfig>
到此集成数据库结束,重新启动tomcat,验证成果:
说明:如果集成成功直接查询是查询不到结果的,需要先将数据同步到solr里面,同步如下:(手动同步)
如果如上直接集成数据库,是不会查到数据,因为solr查询数据是从自己的缓存中查询,并不是从数据库中查询,因此就需要定时的去访问数据库,将数据库中更新的数据同步到solr中。
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="root"/>
<document>
<entity name="userInfo" pk="ID" query="SELECT ID,USER_NAME,SOLR_KEY,UPDATE_TIME FROM USER_INFO "
deltaImportQuery="SELECT ID,USER_NAME,SOLR_KEY,UPDATE_TIME FROM USER_INFO WHERE ID>\'${dih.delta.ID}\'"
deltaQuery="SELECT ID FROM USER_INFO where UPDATE_TIME > \'${dataimporter.last_index_time}\'">
<field column="ID" name="id"/>
<field column="USER_NAME" name="userName"/>
<field column="SOLR_KEY" name="solrKey"/>
<field column="UPDATE_TIME" name="updateTime"/>
entity>
document>
dataConfig>
userInfo.last_index_time=2018-01-06 01\\:11\\:57
last_index_time=2018-01-06 01\\:11\\:57
# 异步同步
syncEnabled=1
# core核心的名称
syncCores=core
# 服务地址
# 默认localhost
server=localhost
# solr项目端口
# 默认8080
port=8080
# 项目名称,也就是solr在tomcatwebapp下项目目录名称
# 如果不是solr,这里需要修改为实际对应值
webapp=solr
# 增量更新执行命令
params=/dataimport?command=delta-import&clean=false&commit=true
# 增量更新间隔时间(单位:分钟)
# 默认30分钟
interval=1
# 索引重建的间隔时间(单位:分钟)
# 默认7200分钟(5天)
reBuildIndexInterval=7200
# 重建索引执行命令
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
# 索引重建的执行时间
reBuildIndexBeginTime=03:10:00
这里的dataimport.properties和managed-schema同目录下的dataimport.properties不是同一个,这里需要在solr-home下创建一个conf目录,里面创建dataimport.properties,上面的内容填入此配置文件中。
到这里就成功了,可以查看tomcat的日志,每隔一分钟就会有一次更新,这里还有一个需要注意的点就是数据表中的update_time时间,这个时间一定要和solr的时间同步,或者稍微比solr时间高,因为增量导入更新就靠这个字段,如果update_time小于solr的时间,solr是感知不到其发生了修改。
<lib dir="${solr.install.dir:../}/contrib/dataimporthandler/lib" regex=".*\\.jar" />
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xmlstr>
lst>
requestHandler>
这里就没有将dataimporthandler和mysql的依赖复制到solr/WEB-INF/lib,而是在solrconfig.xml中指定jar的位置。
在本文中,涉及到复制jar,也涉及到上面的直接引用,不是很整洁,有兴趣的可以整理一下,这里不做太多的赘述。
<dependencies>
<dependency>
<groupId>org.apache.solrgroupId>
<artifactId>solr-solrjartifactId>
<version>5.0.0version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.21version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>compilescope>
dependency>
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
<version>1.2version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
public class SolrConnectTest {
private SolrClient solrClient = null;
private String url = "http://192.168.153.129:8080/solr/core";
@Before
public void initClient() {
solrClient = new HttpSolrClient(url);
}
@Test
public void query() throws SolrServerException {
String queryStr = "solrKey:\\"文远\\"";
SolrQuery solrQuery = new SolrQuery(queryStr);
QueryResponse respOnse= solrClient.query(solrQuery);
SolrDocumentList solrRes = response.getResults();
solrRes.forEach(System.out::println);
}
}
测试查询结果: