基本说明

  • Solr是一个开源项目,基于Lucene的搜索服务器,一般用于高级的搜索功能;
  • solr还支持各种插件(如中文分词器等),便于做多样化功能的集成;
  • 提供页面操作,查看日志和配置信息,功能全面。

solr 7 + tomcat 8实现solr 7的安装

Solr自带集成jetty,但是一般都不直接使用,而是将solr另外和tomcat或jetty服务器集成到一起,形成搜索引擎。
Solr 7解压后的目录:

solr 7安装步骤:
  • 将solr的server/solr-webapp/webapp目录复制到tomcat的webapps目录下,修改名为solr;
  • 将solr的server/solr-webapp/lib/ext下的所有jar包复制到上一步solr/WEB-INF/lib下;
  • 将solr的server/solr-webapp/lib下的metrics-*和gmetric4j-1.0.7.jar复制到上一步的lib目录下;
  • 将solr的server/resources目录下的log4j.properties文件复制到WEB-INF/classes目录下,默认没有classes目录,自己创建;
  • 将solr的server/solr目录复制到tomcat下,命名为solr-home;
  • 改tomcat/webapps/solr/WEB-INF/web.xml文件如下:
<!-- 这个标签默认是注释的,解开,env-entry-value标签下的值修改为solr-home的地址 -->
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:\apache-tomcat-8.5.24\solr-home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<!-- 此段内容需要注释,是个坑,如果不注释,启动tomcat也访问不了solr,因为这里有权限设置 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

solr-home是solr的核心目录,主要的配置文件,索引以及基本数据的保存,插件和数据库的集成都是在此目录下进行配置。
到此solr的基本搭建结束,可以启动tomcat检查solr是否已经安装成功。
查看安装成功:

solr核心core创建

每个实例对应一个core,这内部存储的就是当前core下的所有配置文件,这个的core可以创建多个。创建过程:

  • 在下面的界面输入核心core的信息,点击添加后会报错,不用担心,到solr-home下看会多一个core目录,目录下是空的;
  • 在此目录下新建一个data和conf目录;
  • 将solr的/server/solr/configsets/_default/conf目录下的所有内容复制到刚才创建的conf目录下。
    此时再点击创建就可以完成创建。需要注意的是,在老版本的solr里面schema文件的名称是schema.xml,但在新的版本(5.0以后)中,虽然创建界面显示名称还是schema.xml,但是对应到conf目录下的文件是managed-schema。

Solr集成中文分词器

在早期版本solr集成的中文分词器都是IK,IK分词器是国产的开源项目,但是在2012年后IK分词器就停止了更新,但是Lucene和solr的版本不断的在迭代,IK分词器也不能很好的支持,虽然有人对其进行改写,但是有点坑,这里放弃使用IK,还好solr6以后就有自带的中文分词器,也是比较好用,下面以此为例。

步骤
  • 将solr下的/contrib/analysis-extras/lucene-libs下所有的jar包复制到solr/WEB-INF/lib下;
  • 修改solr-home/core/conf/managed-schema文件:
<!-- 新增的内容 -->
<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"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

集成很简单,重新启动tomcat,进入到实例core下,查看schema是否已经配置成功。

检验集成后的结果:

图片内容分析:
选择刚创建的core,采用模拟分词analysis,输入中文内容,左边表示需要建立索引的字段值,右边表示需要搜索的内容,分析字段选择solrKey,因为在所有字段中,只有solrKey使用了中文分词器,在分析处理的结果显示,”帅哥”两个字已经匹配到。

Solr集成数据库(基本)

solr是作为一个搜索引擎,为什么不直接使用数据库来实现搜索,对于这种搜索都是采用的模糊查询(like %关键字%),在使用like查询的时候,如果关键字前面加上%就会导致查询不会走索引,也就意味着建立索引也是白搭,另外随着数据的增长,这种搜索的效率会很低,在插入更新数据的时候,索引的维护也会影响操作效率,所有一般都会使用第三方搜索工具,solr就是其中之一。为了将数据库数据同步到solr中,这里就会将solr和数据库建立连接,从数据库中同步数据到solr中。

实现步骤
  • 将solr的contrib、dist目录复制到solr-home下;
  • 修改solrconfig.xml配置文件:
<lib dir="${solr.install.dir:../}/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../}/contrib/analysis-extras/lucene-libs" regex=".*\.jar"/>
<lib dir="${solr.install.dir:../}/dist/" regex="solr-cell-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/clustering/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../}/dist/" regex="solr-clustering-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../}/dist/" regex="solr-langid-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../}/dist/" regex="solr-velocity-\d.*\.jar" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里的solr.install.dir表示的是当前solrconfig.xml所在的conf目录,第一步将contrib、dist复制到solr-home下,和conf差一级目录,所有solr.install.dir后加的是../,但是实际情况实际分析去修改../。

  • 复制连接数据库需要的jar包到solr-home/contrib/dataimporthandler/lib(dataimporthandler下默认没有lib目录,需要创建)目录下,两个jar分别是:
    /dist下的solr-dataimporthandler-7.2.0.jar和mysql-connector-java-5.1.17.jar(需要下载);
  • 修改solrconfig.xml配置文件:
<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.xml</str>
</lst>
</requestHandler>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 创建data-config.xml文件,文件放在core/conf目录下,文件基本内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 修改managed-schema文件,添加数据库字段solr_key、user_name、update_time
<field name="solrKey" type="text_smartcn" indexed="true" stored="true" multiValued="false"/>
<field name="userName" type="string" indexed="false" stored="false" multiValued="false"/>
<field name="updateTime" type="pdate" indexed="false" stored="true" multiValued="false"/>
  • 1
  • 2
  • 3

到此集成数据库结束,重新启动tomcat,验证成果:

说明:如果集成成功直接查询是查询不到结果的,需要先将数据同步到solr里面,同步如下:(手动同步)

如果如上直接集成数据库,是不会查到数据,因为solr查询数据是从自己的缓存中查询,并不是从数据库中查询,因此就需要定时的去访问数据库,将数据库中更新的数据同步到solr中。

Solr集成数据库(进阶)

实现步骤
  • 下载dataimportscheduler-1.2.jar,放到solr/WEB-INF/lib下;
  • 修改data-config.xml文件,在entity上添加一个同步的sql信息,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 修改dataimport.properties文件信息:
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

这里的dataimport.properties和managed-schema同目录下的dataimport.properties不是同一个,这里需要在solr-home下创建一个conf目录,里面创建dataimport.properties,上面的内容填入此配置文件中。
到这里就成功了,可以查看tomcat的日志,每隔一分钟就会有一次更新,这里还有一个需要注意的点就是数据表中的update_time时间,这个时间一定要和solr的时间同步,或者稍微比solr时间高,因为增量导入更新就靠这个字段,如果update_time小于solr的时间,solr是感知不到其发生了修改。

说明

  • Solr关联数据库后,会将数据缓存都solr中,当查询的时候实际上查询的是solr里面的内容。
  • 物理删除会存在问题,应为物理删除记录直接消失,没有所谓的更新时间,这个需要看实际需求来修改查询sql,如果是逻辑删除,注意增量更新中加上逻辑删除的查询条件。
  • solr的查询语句语法,本博客没有提及,需要使用的可以找万能的google或者度娘。(solr查询语法推荐博文

坑里来,坑里去:

  • interval格式化失败
    在实现同步的时候,interval设置的值是1,reBuildIndexBeginTime相关参数没有配置,这个时候启动项目会出现interval不能格式化为数值,因为在dataimportscheduler源码里面读取dataimport.properties文件中参数后,会有逻辑来给未设置值的参数设置默认值,这里有个错误就是在判断reBuildIndexBeginTime参数为空后,修改了interval值为00:00:00,导致不能格式化为数值,然后将interval默认的为30分钟。因此在配置的时候需要将reBuild相关参数加上。
  • 时间问题,就是上面提到的solr时间和数据库时间同步问题,因为根据上面的deltaQuery可以看出来,更新数据时通过UPDATE_TIME的时间比较实现,如果出现数据库时间比solr时间迟,就会导致更新延迟现象。
  • Jar包问题,在项目中涉及到很多将contrib、dist目录下的jar复制到solr/WEB-INF/lib下,其实也可以不这样,因为这些jar包相当于是solr/WEB-INF/lib的拓展,但是这些拓展并不是都能使用到,所以都会习惯性的将需要的复制到solr/WEB-INF/lib下,其实这样是不科学的,随着使用功能的复杂,jar包的管理就会变的比较乱。也可以通过在solrconfig.xml文件中配置contrib、dist目录实现。
    如下:
<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.xml</str>
</lst>
</requestHandler>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里就没有将dataimporthandler和mysql的依赖复制到solr/WEB-INF/lib,而是在solrconfig.xml中指定jar的位置。
在本文中,涉及到复制jar,也涉及到上面的直接引用,不是很整洁,有兴趣的可以整理一下,这里不做太多的赘述。

solr-solrj项目查询整合

依赖引入
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
代码实现
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);
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

测试查询结果:

solr 7+tomcat 8 + mysql实现solr 7基本使用(安装、集成中文分词器、定时同步数据库数据以及项目集成)的更多相关文章

  1. solr配置中文分词器

    配置IK分词器 在/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib目录中加入IK分词器的jar包 在/opt/solr-7.7.1/serve ...

  2. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  3. 在eclipse中构建solr项目+添加core+整合mysql+添加中文分词器

    最近在研究solr,这里只记录一下eclipse中构建solr项目,添加core,整合mysql,添加中文分词器的过程. 版本信息:solr版本6.2.0+tomcat8+jdk1.8 推荐阅读:so ...

  4. Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器

    solr 基本介绍 Apache Solr (读音: SOLer) 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.Apache ...

  5. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  6. 我与solr(六)--solr6.0配置中文分词器IK Analyzer

    转自:http://blog.csdn.net/linzhiqiang0316/article/details/51554217,表示感谢. 由于前面没有设置分词器,以至于查询的结果出入比较大,并且无 ...

  7. Solr学习笔记之2、集成IK中文分词器

    Solr学习笔记之2.集成IK中文分词器 一.下载IK中文分词器 IK中文分词器 此文IK版本:IK Analyer 2012-FF hotfix 1 完整分发包 二.在Solr中集成IK中文分词器 ...

  8. Solr4.4入门,介绍Solr的安装、IK分词器的配置及高亮查询结果(转)

    一.Windows下安装solr-4.4.0 1.  下载solr.4.4 2.  下载绿色版tomcat6.0.18 3.  解压下载的solr到d:\study\solr,将dist目录下的sol ...

  9. Windows下面安装和配置Solr 4.9(三)支持中文分词器

    首先将下载解压后的solr-4.9.0的目录里面F:\tools\开发工具\Lucene\solr-4.9.0\contrib\analysis-extras\lucene-libs找到lucene- ...

随机推荐

  1. 通过JS动态创建和删除HTML元素

    <script type="text/javascript" language="Javascript"> function InputOnBlur ...

  2. Maven配置dubbo环境简单例子

    环境准备: 1.zookeeper:zookeeper-3.4.6版本 2.maven:apache-maven-3.3.9版本 3.dubbo监控工具:dubbo-admin-2.5.4-SNAPS ...

  3. 微软更新导致的IIS7设置默认主页无效

    近期两个superKM的老客户出现问题,网站不能自动检索默认文档,必须通过完整网址才能访问. 值得一提的是出现问题的都是 IIS7 和7.5版本,服务器为windows server2008 R2. ...

  4. 不用webservice wcf提供服务,用Rest更轻量

    从2005年开始就开始有基于服务的开发方式,到08年时候 微软和sun等公司都已经提供了很多基于服务的开发框架 . 微软 .net 平台的基于服务的框架主要有:.NET Remoting.webser ...

  5. 在 ASP.NET 网页中不经过回发而以编程方式实现客户端回调

    在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作.此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器.但是,在有些情况下,需要从客户 ...

  6. Cocos2d-X数据、动作、消息的基本操作

    加入类的create方法: CREATE_FUNC(ClassName) 使用这个宏能够为类加入一个create方法. 创建类的对象时一律用Class::create()的形式. 在CREATE_FU ...

  7. NSDate 时间加减

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/pearlhuzhu/article/details/26227393 NSDate有个类别,例如以下 ...

  8. Arrays、ArrayUtils 区别

    Arrays java.util 包提供的静态类:java.util.Arrays 此静态类专门用来操作array ,提供搜索.排序.复制等静态方法. ArrayUtils apache 提供的类:o ...

  9. requestAnimationFrame 提高动画性能的原因

    与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机.具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新 ...

  10. openwrt设置默认登陆密码

    1.修改dropbear配置文件 找到package/network/services/dropbear/files/dropbear.config 修改如下: config dropbear opt ...