搜索引擎solr的使用方法
这篇文章将为大家详细讲解有关搜索引擎solr的使用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
一、下载、安装:
1. 下载地址:https://lucene.apache.org/solr/到官网点击Download下载
2. 下载后解压,如下图
二、运行 (单机)
1. 运行win命令窗口(cmd)
2. 在solr的bin目录下执行启动命令 solr start,solr应用服务器默认端口为8983,如果想指定端口号启动可以加参数-p例 如:solr start -p 8888
启动成功 在浏览器输入 http://localhost:8983/solr打开,如下图:
2. solr常用命令:
solr start -p 端口号 单机版启动solr服务
solr restart -p 端口号 重启solr服务 (注意:使用重启命令必须带有端口号)
solr stop -p 端口号关闭solr服务
solr create -c name 创建一个core实例(core概念后面介绍)
3. 注意点:
在启动的时候如果打印java异常堆栈log4j2.xml 文件名、目录名或卷标语法不正确,原因: log4j的bug, solr.cmd 批处理没弄好。如下图
这个错不影响使用,可以忽略。也可以将 solr-7.4.0/bin/solr.cmd文件里面的所有file: 改成file:/// 就行了
三、创建一个core实例
1. core简介:简单说core就是solr的一个实例,一个solr服务下可以有多个core,每个core下都有自己的索引库和与之相应的配置文件,所以在操作solr创建索引之前要创建一个core,因为索引都存在core下面。
2. 创建core有2中方式,一种是命令 (solr create -c 创建的名称),创建成功后会在 D:\solr-7.4.0\server\solr 目录下出现你创建的core文件夹,如下图:
还有一种是在solr管理页面上创建,在先要在 D:\soft\solr-7.4.0\server\solr 目下创建文件夹并命名为你要创建core的名称,然后到 D:\solr-7.4.0\example\example-DIH\solr\db 目录下将 conf文件夹复制到你的core,最后到solr管理页面上创建core,如下图:
创建成功,如下图:
四、配置managed-schema
1. managed-schema简介
managed-schema是用来告诉solr如何建立索引的,他的配置围绕着一个managed-schema配置文件,这个配置文件决定着solr如何建立索引,每个字段的数据类型,分词方式等,老版本的schema配置文件的名字叫做schema.xml他的配置方式就是手工编辑,但是现在新版本的schema配置文件的名字叫做managed-schema,他的配置方式不再是用手工编辑而是使用schemaAPI来配置,官方给出的解释是使用schemaAPI修改managed-schema内容后不需要重新加载core或者重启solr更适合在生产环境下维护,如果使用手工编辑的方式更改配置不进行重加载core有可能会造成配置丢失,managed-schema所在目录为 D:\solr-7.4.0\server\solr\test1\conf,如下图:
2. managed-schema主要成员
fieldType:为field定义类型,最主要作用是定义分词器,分词器决定着如何从文档中检索关键字,multiValued属性为true时支持该类型为数组结构。
analyzer:他是fieldType下的子元素,这就是传说中的分词器,他由一组tokenizer和filter组成。
field:他是创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed属性为true,stored属性为true表示存储该索引。如下图所示每个field都要引用一种fieldType由type属性定义,multiValued属性为true该字段为数组,数组中每个下标的值solr都会创建索引
关于更多managed-schema的介绍请参考http://lucene.apache.org/solr/guide/7_4/documents-fields-and-schema-design.html
常用的数据类型基本都有,都在managed-schema文件中,搜索fieldType就可以找到
注:一般主键 ID 不用手写定义 field 标签,会自动生成,如果手动定义了在运行的时候回报错。由于managed-schema是复制过来的 最好将文件中定义的
field 标签能删除的都删,避免和自己定义的 field 冲突,定义id的field客源不删除,如下图:
3. Schema API:
Schema API其实就是用post请求向solr服务器发送携带json参数的请求,所有操作内容都封装在json中,如果是linux系统直接使用curl工具,如果是windows系统推荐使用Postman
这里以添加一个field为例,下面列出其他API:
add-field: add a new field with parameters youprovide.
delete-field: delete a field.
replace-field: replace an existing field withone that is differently configured.
观看更多API内容请参考http://lucene.apache.org/solr/guide/7_4/schema-api.html
四、DIH导入索引数据
1. DIH简介:
DIH全称是Data Import Handler 数据导入处理器,顾名思义这是向solr中导入数据的,我们的solr目的就是为了能让我们的应用程序更快的查询出用户想要的数据,而数据存储在应用中的各种地方入xml、pdf、关系数据库中,那么solr首先就要能够获取这些数据并在这些数据中建立索引来达成快速搜索的目的,这里就列举我们最常用的从关系型数据库中向solr导入索引数据。
2. 创建DIH
在自己创建的core目录下conf目录下(比如:D:\solr-7.4.0\server\solr\test1\conf)有个 db-data-config.xml 文件( 如何目录下没有改文件可以到D:\solr-7.4.0\example\example-DIH\solr\db\conf 目下拷贝到自己的目录下),用于连接数据库抽取数据,如下图:
有超文本编辑器打开db-data-config.xml开始编辑,如下图:
entity的默认属性:
name(必需的):name是唯一的,用以标识entity
processor:只有当datasource不是RDBMS时才是必需的。默认值是SqlEntityProcessor
transformer:转换器将会被应用到这个entity上,详情请浏览transformer部分。
pk:entity的主键,它是可选的,但使用"增量导入"的时候是必需。它跟schema.xml中定义的uniqueKey没有必然的联系,但它们可以相同。
rootEntity:默认情况下,document元素下就是根实体了,如果没有根实体的话,直接在实体下面的实体将会被看做跟实体。对于根实体对应的数据库中返回的数据的每一行,solr都将生成一个document。
SqlEntityProcessor的属性:
query (required) :是获取全部数据的SQL
deltaQuery : 只在"增量导入"中使用,只获取增量pk的SQL
parentDeltaQuery:只在"增量导入"中使用,只获取父Entity的pk的SQL
deletedPkQuery:只在"增量导入"中使用,获取当前Entity被删除的pk
deltaImportQuery:(只在"增量导入"中使用) . 如果这个存在,那么它将会在"增量导入"中导入phase时代替query产生作用。
Full Import工作原理:
执行本Entity的Query,获取所有数据;
针对每个行数据Row,获取pk,组装子Entity的Query;
执行子Entity的Query,获取子Entity的数据。
Delta Import工作原理:
查找子Entity,直到没有为止;
执行Entity的deltaQuery,获取变化数据的pk;
合并子Entity parentDeltaQuery得到的pk;
针对每一个pk Row,组装父Entity的parentDeltaQuery;
执行parentDeltaQuery,获取父Entity的pk;
执行deltaImportQuery,获取自身的数据;
如果没有deltaImportQuery,就组装Query
限制:
子Entity的query必须引用父Entity的pk
子Entity的parentDeltaQuery必须引用自己的pk
子Entity的parentDeltaQuery必须返回父Entity的pk
deltaImportQuery引用的必须是自己的pk
在solrconfig.xml(目录 D:\solr-7.4.0\server\solr\test1\conf)文件最下面增加配置:
db-data-config.xml
如下图:
在创建的core目录下(D:\solr-7.4.0\server\solr\test1)创建 lib 文件夹,将数据库驱动jar包复制进去。在D:\soft\solr-7.4.0\dist文件夹下的solr-dataimporthandler-4.5.1.jar和solr-dataimporthandler-extras-4.5.1.jar也复制进去(这2个jar不一定需要复制,跟进启动后看日志是否报 没有这个类 org.apache.solr.handler.dataimport.DataImportHandler,报了就复制进去)
之后重启solr,如下图:
重启成功之后打开solr管理,选择创建的core并抽取数据,可以在D:\solr-7.4.0\server\logs下查询日志记录,如下图:
执行成功之后,查看结果,如下图:
删除solr数据,如下图:
*:*
也可以使用 访问url删除
根据ID删除
http://localhost:8080/solr/update/?stream.body=
根据查询条件查询
http://localhost:8080/solr/update/?stream.body=
五、Solr中启用定时器自动更新
下载 solr-dataimport-scheduler.jar 将其复制到 D:\solr-7.4.0\server\solr-webapp\webapp\WEB-INF\lib 下,如下图:
找到web.xml (D:\solr-7.4.0\server\solr-webapp\webapp\WEB-INF)在第一个servlet标签添加
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
如下图:
在D:\solr-7.4.0\server\solr目录下成交conf文件夹,之后再conf下创建dataimport.properties文件,如下图:
编辑dataimport.properties文件
################################################## ## dataimport scheduler properties ## ################################################## # tosync or not to sync# 1- active; anything else - inactive# 这里的配置不用修改syncEnabled=1 # which cores to schedule# ina multi-core environment you can decide which cores you want syncronized# leave empty or comment it out if using single-core deployment# 修改成你所使用的core,我这里是我自定义的core:test1syncCores=test1 # solr server name or IP address# [defaults to localhost if empty]这个一般都是localhost不会变server=localhost # solr server port# [defaults to 80 if empty]# 安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了port=8983 # application name/context# [defaults to current ServletContextListener's context (app) name]# 这里默认不改webapp=solr # URL params [mandatory]# remainder of URL# 这里改成下面的形式,solr同步数据时请求的链接# command=delta-import 是增量抽取,command=full-import 是全量抽取#params=/dataimport?command=delta-import&clean=false&commit=true params=/dataimport?command=full-import&clean=false&commit=true # schedule interval# number of minutes between two runs# [defaults to 30 if empty]#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改# 开始测试的时候为了方便看到效果,时间可以设置短一点interval=1 # 重做索引的时间间隔,单位分钟,默认7200,即5天;# 为空,为0,或者注释掉:表示永不重做索引reBuildIndexInterval=7200 # 重做索引的参数reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true # 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期reBuildIndexBeginTime=03:10:00
在重启之后dataimport.properties文件注释会都没有了,如下图:
之后重新启动solr,之后定时就启用了。
六、集成到项目中
maven引入jar,注:如果有特殊需要需要引入httpclient 那要注意httpclient的版本与solr的版本兼容,solr7.4的httpclient不得低于4.5.3
org.apache.solr solr-solrj 7.4.0
spring-solr.xml
在spring的ApplicationContext.xml增加
在Java中简单使用
package com.solr;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.UpdateResponse;import org.apache.solr.common.SolrDocument;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;import java.io.IOException;public class SolrTest { private static HttpSolrClient httpSolrClient; /** * 新增或更新 */ public void save() throws IOException, SolrServerException { SolrInputDocument document = new SolrInputDocument(); //注意是SolrInputDocument,而非SolrDocument //可为文档指定id,即addField("id","主键id"),如果id相同则操作为更新。 document.addField("id", "123"); document.addField("name", "54151"); //key一直会在solr 将 type构造成数组结构 document.addField("type", 555); document.addField("type", 432434); UpdateResponse responseAdd = httpSolrClient.add(document); //这里也不一样,不像以往版本的提交 httpSolrClient.commit(); //提交 System.out.println("save成功"); } /** * 查询 */ public void query() throws IOException, SolrServerException { //声明查询对象,并设置查询条件 SolrQuery query = new SolrQuery(); query.set("q", "id:123"); //执行查询 QueryResponse response = httpSolrClient.query(query); //获取查询结果 SolrDocumentList documentList = response.getResults(); for (SolrDocument document : documentList) { System.out.println("查询到name:" + document.get("name")); System.out.println("ID:" + document.get("id")); System.out.println(); } } /** * 删除 */ public void delete() throws IOException, SolrServerException { httpSolrClient.deleteByQuery("id:123"); //这是根据查询条件删除,也可根据id删除 httpSolrClient.commit(); System.out.println("删除成功"); }}
关于搜索引擎solr的使用方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。