1. solr7.4教程 使用solr的完整流程
本文摘要
- 一、下载与安装
- 二、运行solr
- 三、创建core实例
- 四、配置schema
- 五、DIH导入数据
- 六、solrJ(java客户端)
本文所用到的工具
Postman :简单说就是一个可以发送post请求的http客户端 这是官网地址https://www.getpostman.com/
IKAnalyzer中文分词器 :一个第三方分词器,下载地址
一、下载与安装:
1. 下载:https://lucene.apache.org/solr/到官网点击Download下载。
2. 下载完成后会得到一个压缩包,解压后会获得一个solr_7.4.0文件夹,此文件夹目录结构如下图
二、运行solr
Solr的运行分为单机运行和集群运行,这里以单机为例:
1. 在bin目录下执行bin/solr start 此命令会启动solr应用服务器默认端口为8983,如果想指定端口号启动可以加参数–p例 如:solr start –p 8888.
如图这句提示出现后证明服务启动成功(启动过程中如果打印java异常堆栈log4j2.xml 文件名、目录名或卷标语法不正确。没有关系不妨碍我们正常使用solr可以忽略此问题),接下来在浏览器输入http://localhost:8888/solr可以进入Admin UI界面验证是否启动成功如下图.
此界面是用来管理solr的,此时solr服务器已经可以启动成功啦下面介绍一下其他比较常用的solr命令。
2. solr常用命令:
solr start –p 端口号 单机版启动solr服务
solr restart –p 端口号 重启solr服务
solr stop –p 端口号关闭solr服务
solr create –c name 创建一个core实例(core概念后面介绍)
此外有关于solr集群版启动方式和其他更多的命令可以参看官方文档https://lucene.apache.org/solr/guide/7_4/solr-control-script-reference.html
三、创建core实例:
1. core简介:简单说core就是solr的一个实例,一个solr服务下可以有多个core,每个core下都有自己的索引库和与之相应的配置文件,所以在操作solr创建索引之前要创建一个core,因为索引都存在core下面。
2. core创建:core的创建方式有很多种一下列出两种比较方便的。
(1) 在bin目录下执行solr create –c name,创建一个core,默认创建出来的位置如下图
(2) 第二种方式是直接使用AdminUI页面创建一个core,如下图
四、 配置schema
1. schema简介:
schema是用来告诉solr如何建立索引的,他的配置围绕着一个schema配置文件,这个配置文件决定着solr如何建立索引,每个字段的数据类型,分词方式等,老版本的schema配置文件的名字叫做schema.xml他的配置方式就是手工编辑,但是现在新版本的schema配置文件的名字叫做managed-schema,他的配置方式不再是用手工编辑而是使用schemaAPI来配置,官方给出的解释是使用schemaAPI修改managed-schema内容后不需要重新加载core或者重启solr更适合在生产环境下维护,如果使用手工编辑的方式更改配置不进行重加载core有可能会造成配置丢失,配置文件所在的路径如下图:
2. schema主要成员:
(1) fieldType:为field定义类型,最主要作用是定义分词器,分词器决定着如何从文档中检索关键字。
(2) analyzer:他是fieldType下的子元素,这就是传说中的分词器,他由一组tokenizer和filter组成,如下图所示
(3) field:他是创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed属性为true,stored属性为true表示存储该索引。如下图所示每个field都要引用一种fieldType由type属性定义
这里描述的只是最常用的三个元素,关于更多schema的介绍请参考http://lucene.apache.org/solr/guide/7_4/documents-fields-and-schema-design.html
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
4.中文分词器:
solr自带了一些中文分词器,比较好用的是SmartChineseAnalyzer,但是扩展性比较差不能自定义扩展中文词库,所以这里选择使用IKAnalyzer,这是第三方的一个分词器可以很好的扩展中文词库,IKAnalyzer下载后解压会有如下文件
把核心jar文件复制到solr WEB应用的lib文件夹下,如下图
把配置文件和词库等文件复制到WEB应用的classes文件夹下,如果子WEB-INF下没有这个文件夹自己创建即可,如下图:
如果想要扩展词库可以在ext.dic文件中配置自定义的中文词组,例如:诛仙这个词组,这个分词器的算法是算不出来的但是通过我们自定义词库,分词器也可以把诛仙列出关键词。
上图是ext.dic文件中的内容,注意编辑此文件时字符编码最好是UTF-8无BOM模式,这个可以通过EditPlus等文本编辑工具设置。下面开始在Schema中应用分词器如下图:
定义了一个text_ik这个字段类型并采用Ik分词器,接下来在field元素定义式指定type=text_ik就可以把这个分词器应用在这个field中。
接下来我们来验证下ik分词器,如下图:
五、DIH导入索引数据
1. DIH简介:
DIH全称是Data Import Handler 数据导入处理器,顾名思义这是向solr中导入数据的,我们的solr目的就是为了能让我们的应用程序更快的查询出用户想要的数据,而数据存储在应用中的各种地方入xml、pdf、关系数据库中,那么solr首先就要能够获取这些数据并在这些数据中建立索引来达成快速搜索的目的,这里就列举我们最常用的从关系型数据库中向solr导入索引数据。
2. 在我们自己建立的core的目录下有conf目录,这里面有着几个很重要的配置文件,之前我们用到的managed-schema(老版本是schema.xml)也在其中,另外还有一个solrconfig.xml文件,这是我们DIH配置的第一步,需要在此文件中配置数据导入文件的映射位置如下图:
第二步配置数据导入文件,这个文件可以在solr根目录下的示例文件中copy一份到core/conf目录下,也就是跟solrconfig.xml在一个目录下,因为solrconfig.xml中配置的相对路径就是这里,当然也可以写绝对路径。如下图:
Copy过去之后这个文件名可以自定义,我就改成了MyDataConfig.xml,下面开始配置如下图:
(1)首先配置数据源关系型数据库基本四项,驱动类,url,用户名,密码。
(2)配置document,可以把它当作与mysql中数据库一个层级的对象。
(3)配置entity,可以把它当作与数据库中一个表对应,在query中书写查询sql。
(4)配置field与表中的字段与之对应。
注意这里容易与schema中的配置混淆,我的理解是schema中配置的是创建索引的配置,而索引的创建需要有数据基础,而现在讲的数据导入文件就是建立索引的数据基础,他是创建索引的元数据。现在配置文件完成后可以用DIH命令执行了。
3. DIH 命令
DIH命令就是用来执行数据导入的,命令种类繁多这里只列出简单常用。DIH命令采用的方式是URL的方式。
full-import:全部数据导入例如:
接下来验证下数据是否真的导入成功了,如下图
fq:过滤的字段,df:默认查询字段,start,rows:分页配置,sort:排序,更多关于查询语句的介绍请参考http://lucene.apache.org/solr/guide/7_4/searching.html
六、solrJ(java客户端)
简介:solrJ是java访问solr的客户端工具包,solr也提供了其他语言访问的客户端,可以到官方文档查看,现在solr的索引和数据导入都已经有,但是作为项目中应用的一个组件,少不了java与solr的沟通。
1. 导入solrJ依赖
如果你是用的是依赖管理工具如maven那么很简单直接添加依赖。
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.4.0</version>
</dependency>
2.从solr中查询索引
3. 向solr添加更改索引
(1)java实体对象与solr索引映射
(2)向solr添加或更新索引,如果此实体在solr索引库中已有则作为更新操作
2. solr基本查询和高级查询
1 查询参数
常用:
-
q
- 查询字符串,必须的。 -
fl
- 指定返回那些字段内容,用逗号或空格分隔多个。 -
start
- 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。 -
rows
- 指定返回结果最多有多少条记录,配合start来实现分页。 -
sort
- 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]
。示例:(inStock desc, price asc)表示先 "inStock" 降序, 再 "price" 升序,默认是相关性降序。 -
wt
- (writer type)指定输出格式,可以有 xml, json, php, phps。 -
fq
- (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031]
,找关键字mm,并且date_time是20081001到20091031之间的 - 注意:solr查询时间为UTC 格式(2013-04-25T22:22:12.000Z)
- 如:
- timestamp:[* TO NOW]
- createdate:[1976-03-06T23:59:59.999Z TO *]
- createdate:[1995-12-31T23:59:59.999Z TO 2007-03-06T00:00:00Z]
- pubdate:[NOW-1YEAR/DAY TO NOW/DAY+1DAY]
- createdate:[1976-03-06T23:59:59.999Z TO 1976-03-06T23:59:59.999Z+1YEAR]
- createdate:[1976-03-06T23:59:59.999Z/YEAR TO 1976-03-06T23:59:59.999Z]
不常用:
-
defType
: -
q.op
- 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定 -
df
- 默认的查询字段,一般默认指定 -
qt
- (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
其它:
-
indent
- 返回的结果是否缩进,默认关闭,用indent=true|on
开启,一般调试json,php,phps,ruby输出才有必要用这个参数。 -
version
- 查询语法的版本,建议不使用它,由服务器指定默认值。
2 检索运算符
-
:
指定字段查指定值,如返回所有值: -
?
表示单个任意字符的通配 -
*
表示多个任意字符的通配(不能在检索的项开始使用*或者?符号) -
~
表示模糊检索,如检索拼写类似于"roam"的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。 邻近检索,如检索相隔10个单词的"apache"和"jakarta","jakarta apache"~10 -
^
控制相关度检索,如检索jakarta apache,同时希望去让"jakarta"的相关度更加好,那么在其后加上""符号和增量值,即jakarta4 apache - 布尔操作符
AND、||
- 布尔操作符
OR、&&
- 布尔操作符
NOT、!、-
(排除操作符不能单独与项使用构成查询) -
+
存在操作符,要求符号"+"后的项必须在文档相应的域中存在 -
()
用于构成子查询 -
[]
包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710] -
{}
不包含范围检索,如检索某时间段记录,不包含头尾,date:{200707 TO 200710} -
"
转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ " ~ * ? : "
3 示例
- 1. 查询所有
http://localhost:8080/solr/primary/select?q=*:*
- 2. 限定返回字段
http://localhost:8080/solr/primary/select?q=*:*&fl=productId
表示:查询所有记录,只返回productId字段
- 3. 分页
http://localhost:8080/solr/primary/select?q=*:*&fl=productId&rows=6&start=0
表示:查询前六条记录,只返回productId字段
- 4. 增加限定条件
http://localhost:8080/solr/primary/select?q=*:*&fl=productId&rows=6&start=0&fq=category:2002&fq=namespace:d&fl=productId+category&fq=en_US_city_i:1101
表示:查询category=2002、en_US_city_i=110
以及namespace=d的前六条记录,只返回productId和category字段
- 5. 添加排序
http://localhost:8080/solr/primary/select?q=*:*&fl=productId&rows=6&start=0&fq=category:2002&fq=namespace:d&sort=category_2002_sort_i+asc
表示:查询category=2002以及namespace=d并按category_2002_sort_i
升序排序的前六条记录,只返回productId字段
- 6. facet查询
现实分组统计结果
http://localhost:8080/solr/primary/select?q=*:*&fl=productId&fq=category:2002&facet=true&facet.field=en_US_county_i&facet.field=en_US_hotelType_s&facet.field=price_p&facet.field=heatRange_i
http://localhost:8080/solr/primary/select?q=*:*&fl=productId&fq=category:2002&facet=true&facet.field=en_US_county_i&facet.field=en_US_hotelType_s&facet.field=price_p&facet.field=heatRange_i&facet.query=price_p:[300.00000+TO+*]
facet
基本参数:
具体实例和用法参考:
参考:facet用法
group
查询的url:
http://localhost:8080/solr/my_solr/select?q=province:湖&wt=xml&indent=true&rows=100&group=true&group.field=province&group.field=province&group.limit=20&group.ngroups=true
group=true:设置开启分组查询
group.field=province:设置分组字段
group.limit=20:设置分组后展示分组下数据量
group.ngroups=true:设置为true表示会返回分组的分组
和sql的group类似。