Solr在Spring项目下的开发使用指引

Solr在Spring项目下的开发使用指引

简介

Solr 是一个基于 Apache Lucene 之上的搜索服务器,它是一个开源的、基于 Java 的信息检索库。它旨在驱动功能强大的文档检索应用程序 。Solr 提供了对多个字段和多面搜索结果的复杂查询的最简单关键字搜索支持,搜索具有更多关于搜索和查询的详细信息。它对外提供 API 接口,使程序员能够轻松地开发具有高级功能的复杂、高性能的搜索应用程序。用户可以通过 HTTP 请求或者使用 Http Get 提出查找请求。

Solr 是基于开放标准的,所以它是高度可扩展的。Solr 查询是简单的 HTTP 请求 URL,响应是一个结构化文档:主要是 JSON,但也可以是 XML、CSV 或其他格式。这意味着各种各样的客户端将能够使用 Solr,从其他 Web 应用程序到浏览器客户端、丰富的客户端应用程序和移动设备。任何能够使用 HTTP 的平台都可以与 Solr 对话。

Solr 安装要求

Java 要求

您将需要 1.8 或更高版本的 Java 运行时环境(JRE)。

安装包获取

您可以在此下载最新版本的 Solr:https://solr.apache.org/downloads.html

直接下载对应操作的压缩包解压即可开始使用

启动和停止

启动 solr 服务

/solr/solr-8.9.0/bin/solr start -force

注:建议使用默认端口 8983,不建议自定义端口,windows下时不带-force参数

停止 solr 服务

/solr/solr-8.9.0/bin/solr stop -all -force

重启 solr

/solr/solr-8.9.0/bin/solr restart -force

状态检查

检查 solr 状态

/solr/solr-8.9.0/bin/solr status

访问 solr 管理页面

http://solr 服务 IP:8983/solr/#/

创建配置 core

Solr可以同时支持多个应用,不同应用可以利用core进行归类管理

创建业务 core

/solr/solr-8.9.0/bin/solr create -c ccmadapt -force

配置 core

vi /solr/solr-8.9.0/server/solr/ccmadapt/conf/managed-schema

添加以下内容添加以下内容

 <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="documentName" type="text_general" indexed="true" stored="true" docValues="false" multiValued="false"/>
   <field name="documentUrl" type="text_general" indexed="true" stored="true" multiValued="false"/>
   <field name="documentToc" type="text_general" indexed="true" stored="true" multiValued="true"/>
   <field name="documentContent" type="text_general" indexed="true" stored="true" multiValued="false"/>
   <field name="fullText" type="text_general" indexed="true" stored="true" multiValued="true"/>

  <copyField source="documentName" dest="fullText"/>
  <copyField source="documentUrl" dest="fullText"/>
  <copyField source="documentToc" dest="fullText"/>
  <copyField source="documentContent" dest="fullText"/>

 <!-- ChineseAnalyzer 自带的中文分词器 -->
  <fieldType name="solr_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    </analyzer>
  </fieldType>

注:也可以使用第三方的分词器,比如ik分词器
  <!-- 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>
cd /solr/solr-8.9.0/server/solr-webapp/webapp/WEB-INF/lib/
wget https://repo1.maven.org/maven2/com/github/magese/ik-analyzer/8.4.0/ik-analyzer-8.4.0.jar

cp /solr/solr-8.9.0/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-8.9.0.jar /solr/solr-8.9.0/server/solr-webapp/webapp/WEB-INF/lib/

接口实现

  1. 项目中实现的文档管理接口
保存文档
POST /document/api/add
移除文档
DELETE /document/api/delete
获取指定编号的文档
GET /document/api/get
获取所有文档
GET /document/api/list
检索文档内容
POST /document/api/query
更新文档
PUT /document/api/update

​ 注:其中检索文档内容接口【POST /document/api/query】是主要被调用接口

  1. 检索文档内容接口对应的接口请求参数:
QueryDocumentParam{
description:	检索文档参数,此处的各参数属性名保持和solr API的对应参数名一致

df		integer($int32)
 		example: 0
		检索范围,枚举值类SearchField。取值范围:0:索引、1:正文、2:全文(文档正文、索引、名称、路径)默认值0

fq		integer($int32)
		example: 0
		检索语言,枚举值类SearchLang。取值范围:0:不限定语言(即全部语言)、1:英文、2:简体中文、3:繁体中文、…其它支持的语言格式参看SearchLang。默认值0

hl		integer($int32)
		example: 0
		匹配结果高亮显示格式,枚举值类HighLight。取值范围:0:不强调显示、1:加红、2:加红加粗。默认值0

q*		string
		检索关键字, 不区分大小写,默认空。注:当全部为中文时,最大长度不能超过868个

rf		integer($int32)
		example: 0
		高亮内容的输出格式,枚举值类ResponseFormat。取值范围:0:原始内容格式、1:HTML格式。默认值0

rows	integer($int32)
		example: 0
		一次查询最大返回记录数,即分页时每页的大小。默认值10

start	integer($int32)
		example: 0
		查询时跳过的行数,即分页时的起始行(首行索引0)。默认值0
}
  1. 检索文档内容接口对应的接口应答结果:
{
  "data": [
    {
      "highlight": [
        "高亮匹配结果集"
      ],
      "id": "文档编号",
      "lang": "文档语言",
      "name": "文档名称",
      "toc": [
        "文档目录"
      ],
      "url": "文档地址"
    }
  ],
  "rows": 分页参数:分页大小,
  "start": 分页参数:起始行号,
  "total": 分页参数:总行数
}

程序配置

下面结合CCM网站后台工程的实现,讲解如何在实际项目中使用Solr管理文档。CCM网站后台工程使用spring boot,其它Spring相关项目的配置与它类似。在CCM网站工程里只处理多语言的markdown类型文档。

配置文件配置参数

默认的程序配置在工程下/resources/config/application.yml

  1. solr 服务地址

    spring:
      data:
        solr:
          #host: http://127.0.0.1:8983/solr/ccmadapt
    

    注:使用配置文件配置时启用注释掉的行设置成实际的 solr core 地址

  2. markdown 文档相关设置

    document:
      watch:
        min-size: 1B
        max-size: 100MB
        suffix: md 注:多种类型文档时使用逗号分割各文档的后缀名
        watchList:  注:允许检索多个目录下的文档
          - .\data\docs_direct1
          - .\data\docs_direct2
    

环境变量配置参数

使用环境变量替换以上配置的方法:

windows:

set SPRING_DATA_SOLR_HOST=http://solrIP:8983/solr/ccmadapt
set DOCUMENT_WATCH_SUFFIX=逗号分隔的扫描文档类型
set DOCUMENT_WATCH_WATCHLIST=逗号分隔的扫描文档目录入口
set DOCUMENT_WATCH_MIN-SIZE=扫描文档的最小大小,单位必须是B,KB,MB
set DOCUMENT_WATCH_MAX-SIZE=扫描文档的最大大小,单位必须是B,KB,MB

linux:

export SPRING_DATA_SOLR_HOST=http://solrIP:8983/solr/ccmadapt
export DOCUMENT_WATCH_SUFFIX=逗号分隔的扫描文档类型
export DOCUMENT_WATCH_WATCHLIST=逗号分隔的扫描文档目录入口
export DOCUMENT_WATCH_MIN_SIZE=扫描文档的最小大小,单位必须是B,KB,MB
export DOCUMENT_WATCH_MAX_SIZE=扫描文档的最大大小,单位必须是B,KB,MB

注:

  1. 使用环境变量前,需要注释掉配置文件里的配置,否则配置文件里的配置会优先于环境变量生效!

    关于 Spring-boot 各种情况配置生效优先级顺序可以参看:

    https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.external-config

关于语言代码

扫描文档时获取到了语言代码的文档,将会被用于创建搜索索引,以支持按语言搜索文档。

下面是自定义需求实现,你可以根据你的项目需求进行调整。

建议文档存放的目录按照国际语言代码目录存放,如下所示目录

.
├── en-US
├── zh-CN
└── zh-TW

2.1. 当文档存在的目录存在多级国际语言代码目录时,将取最靠近文档实际位置的一层国际语言代码名称作为文档的语言代码。

2.2. 当未给文档指定存在目录的国际语言代码时,系统将扫描文档的文件名判断文档最可能的语言代码。

2.3. 目前只支持识别中文和英文,具体的识别优先级是繁体中文>简体中文>英文。注意!其它语言当前未被检测识别,在必要支持时可以增加检测逻辑以支持检测。在被支持前,所有未被检测支持的语言代码都将被默认识别为英文文档。

Solr 常见问题

1.部署访问查询接口报排序字段 documentName 多值的问题
解决方法:

vi /solr/solr-8.9.0/server/solr/ccmadapt/conf/managed-schema

找到这一行,添加 docValues="false"如下所示

<field name="documentName" type="text_general" indexed="true" stored="true" docValues="false"  multiValued="false"/>

重启 solr

/solr/solr-8.9.0/bin/solr restart -force