Solr之基础讲解入门
1 Solr
1.1 简介
Solr
采用Lucene
搜索库为核心,提供全文索引和搜索开源企业平台,提供REST
的HTTP/XML
和JSON
的API
,本教程以solr8.11
作为测试环境,jdk版本需要1.7及以上版本
1.2 入门使用
1.2.1 下载及准备
Solr 可从https://solr.apache.org/downloads.html获得:最新版 Solr 下载。
有三个独立的包:
- solr-8.11.0.tgz 适用于 Linux/Unix/OSX 系统
- solr-8.11.0.zip 适用于 Microsoft Windows 系统
- solr-8.11.0-src.tgz包 Solr 源代码
解压:
解压后目录布局:
bin
此目录中包含几个重要的脚本,这些脚本将使使用 Solr 更容易。solr
和solr.cmd
这是Solr
的控制脚本,也称为bin/solr
(对于 Linux)或者bin/solr.cmd
(对于 Windows)。这个脚本是启动和停止Solr
的首选工具。也可以在运行SolrCloud
模式时创建集合或内核、配置身份验证以及配置文件。post
Post Tool
,它提供了用于发布内容到Solr
的一个简单的命令行界面。solr.in.sh
和solr.in.cmd
这些分别是为 Linux 和 Windows 系统提供的属性文件
。在这里配置了Java、Jetty 和 Solr
的系统级属性。许多这些设置可以在使用bin/solr
或者bin/solr.cmd
时被覆盖,但这允许你在一个地方设置所有的属性。install_solr_services.sh
该脚本用于Linux 系统以安装 Solr 作为服务
contrib
Solr
的contrib
目录包含 Solr 专用功能的附加插件。dist
该dist
目录包含主要的Solr.jar
文件。docs
该docs
目录包括一个链接到在线 Javadocs 的 Solr。example
该example
目录包括演示各种Solr
功能的几种类型的示例licenses
该licenses
目录包括Solr
使用的第三方库的所有许可证。server
此目录是Solr
应用程序的核心所在。此目录中的 README 提供了详细的概述,但以下是一些特点:Solr
的Admin UI
(server/solr-webapp
)Jetty
库(server/lib
)- 日志文件(
server/logs
)和日志配置(server/resources
) - 示例配置(
server/solr/configsets
)
1.2.2 启动关闭
解压后进入cmd
进入bin
目录执行 solr.cmd start(或者 solr start)
命令,命令行显示如下,启动成功,默认端口8983
,也可通过-p
指定端口启动
浏览器访问:http://localhost:8983/solr/
,你看到的就是solr
的管理界面
关闭使用solr.cmd stop -p 8983 (或者solr stop -p 8983)
再或者solr.cmd stop -all
命令
1.2.3 solr core创建
如果没有使用示例配置启动Solr
,则需要创建一个核心才能进行索引和搜索,在创建后通过solr.cmd status
查看状态
core
就是solr
的一个实例,一个solr
服务下可以有多个core
,每个core
下都有自己的索引库和与之相应的配置文件。命令行和管理页面都可以创建core
,在这通过命令行创建。
在命令行输入solr create -c "自定义core_name"
1.2.4 solr配置安全验证
由于启动后默认是不用登入即可访问 Solr 管理界面,这样暴露了Solr核心库,易引起他人删除索引库数据,故配置登入权限才可访问 Solr 管理界面,步骤如下
1.2.4.1 新建security.json(推荐)
创建该security.json
文件并将其放在$SOLR_HOME
你的安装目录中(这与 solr.xml
所在的位置相同,通常为 server/solr 下
)。以下配置用户名密码是:solr:SolrRocks
{
"authentication":{
"blockUnknown": true,
"class":"solr.BasicAuthPlugin",
"credentials":{
"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="
},
"realm":"My Solr users",
"forwardCredentials": false
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[
{
"name":"security-edit",
"role":"admin"
}
],
"user-role":{
"solr":"admin"
}
}
}
配置文件说明
authentication
: 启用了基本身份验证和基于规则的授权插件。blockUnknown
: 该参数true
表示不允许未经身份验证的请求通过。credentials
: 定义了一个名为solr
的用户,并带有密码,密码是由密码和盐值中间一个空格
组成(空格多了登录不成功)"realm":"My Solr users"
: 我们覆盖该realm
属性以在登录提示上显示另一个文本forwardCredentials
: 该参数false
表示我们让Solr
的PKI
身份验证处理分布式请求,而不是转发Basic Auth
标头。
authorization
授权permissions
"name":"security-edit"
"role":"admin"
角色已被定义,它有权编辑安全设置。
user-role
"solr":"admin"
用户已被定义为admin
角色。
修改配置文件中用户密码
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;
public class SolrDemo {
public static void main(String[] args) {
// 密码
String password = "SolrRocks";
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-256");
final Random random = new SecureRandom();
byte[] salt = new byte[32];
random.nextBytes(salt);
digest.reset();
digest.update(salt);
byte[] btPass = digest.digest(password.getBytes(StandardCharsets.UTF_8));
digest.reset();
btPass = digest.digest(btPass);
System.out.println(Base64.encodeBase64String(btPass) + " " + Base64.encodeBase64String(salt));
} catch (NoSuchAlgorithmException e) {
System.err.println("Unknown algorithm: " + e.getMessage());
}
}
}
1.2.4.2 用户增删改(仅作参考)
请求方式:post,Content-Type:application/json
请求路径:http://已有用户名:密码@127.0.0.1:8983/solr/admin/authentication
#新增或修改密码(如果用户名存在,就修改密码,否则就创建用户)
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'
#删除用户
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"delete-user": ["tom", "harry"]}'
#设置属性
curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-property": {"blockUnknown":false}}'
注意
:用户名和密码尽量不要带特殊字符,否则使用地址栏传用户名密码的时候访问不了
1.2.4.3 jetty配置验证
1.2.4.3.1 etc内添加
在解压后的安装目录solr-8.11.1\server\etc
内,在此目录下新建verify.properties
配置文件(名字随意),如图
打开文件进行编辑 , 内容如下(格式为:用户名:密码,权限
)
#用户名 密码 权限
user:pass,admin
#也可配置多用户,内容如下:
user: pass,admin
user1: pass,admin
user3: pass,admin
1.2.4.3.2 solr-jetty-context.xml
接着找到目录:solr-8.11.1\server\contexts
下的文件solr-jetty-context.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath"><Property name="hostContext" default="/solr"/></Set>
<Set name="war"><Property name="jetty.base"/>/solr-webapp/webapp</Set>
<Set name="defaultsDescriptor"><Property name="jetty.base"/>/etc/webdefault.xml</Set>
<Set name="extractWAR">false</Set>
<!-- 添加以下代码 -->
<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">verify-name</Set>
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/verify.properties</Set>
</New>
</Set>
</Get>
</Configure>
1.2.4.3.3 web.xml
路径在:solr-8.11.1\server\solr-webapp\webapp\WEB-INF
下的web.xml
文件
在文件中找到security-constraint
的配置,内容如下
<!-- Get rid of error message -->
<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>
在之后追加如下代码(删除security-constraint
,会导致登录的配置无效),具体配置如下,在auth-constraint
节点添加角色 admin
,并添加登录配置
<security-constraint>
<web-resource-collection>
<web-resource-name>Solr</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>verify-name</realm-name>
</login-config>
1.3 Core操作
如果说 Solr
相当于一个数据库的话,那么 Core
就相当于一张表
1.3.1 图形创建删除
图形创建如下,可能会报错:Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: Can't find resource...
只用把 \server\solr\configsets\_default
下的 conf
文件夹全部 复制到新建的Core下:\server\solr\new_core\
即可 创建或者删除
1.3.2 命令创建删除
创建时,在bin
目录下执行:solr.cmd create -c test002
删除命令是在bin
目录下执行:solr.cmd delete -c test002
PS D:\SoftWare\Tools\Solr\solr-8.11.2\bin> .\solr.cmd create -c test002
WARNING: Using _default configset with data driven schema functionality. NOT RECOMMENDED for production use.
To turn off: bin\solr config -c test002 -p 8983 -action set-user-property -property update.autoCreateFields -value false
Created new core 'test002'
PS D:\SoftWare\Tools\Solr\solr-8.11.2\bin>
1.3.3 添加字段
创建Core 中的Core就相当于表,那么接下来就要为这个表设置字段,用于存放数据
左边选中 test001 -> Schema -> Add Field
输入name: name
, field type: my_ik
, 这里一定要使用中文分词中新创建的 my_ik类型,否则后续查询中文会失败。
然后点击 Add Field
按钮进行添加
注意
:id
字段是默认就有的,无需自己创建
1.4 添加中文分词器
1.4.1 没有设置分词器
默认情况下是没有中文分词的,如图所示,通过点击左边的 test001->Analysis
然后输入 我们都去动物园,得到是按照每个字的分词效果
1.4.2 下载分词器
下载地址: https://mvnrepository.com/artifact/com.github.magese/ik-analyzer/8.3.0
或者通过maven
更新下载
<dependency>
<groupId>com.github.magese</groupId>
<artifactId>ik-analyzer</artifactId>
<version>8.4.0</version>
</dependency>
1.4.3 复制jar包
把下载好的jar包放到以目录:server\solr-webapp\webapp\WEB-INF\lib
1.4.4 修改schema
在solr 6.6
之前是schema.xml
文件,之后则是managed-schema
,其位置在 server\solr\新建的core文件夹\conf\文件夹下,比如:server\solr\test001\conf\
添加以下内容
<!-- 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>
1.4.5 配置停止词,同义词和扩展词库
停止词
:lucene
的停止词是无功能意义的词,比如is 、a 、are 、”的”,“得”,“我” 等,这些词会在句子中多次出现却无意义,所以在分词的时候需要把这些词过滤掉。
扩展词库
:就是不想让哪些词被分开,让它们分成一个词。
同义词
:假设有一个电子商务系统,销售书籍,提供了一个搜索引擎,一天,市场部的人要求客户在搜索书籍时,同义词就是比如输入电子
,除了展示电子相关的书籍,还需要展现机器
相关的书籍
1.4.5.1 扩展词和停止词
把添加的ik-analyzer-8.5.0.jar
jar包内的配置文件IKAnalyzer.cfg.xml
和自定义词典ext.dic
和停用词词典stopword.dic
复制到 ${solr_home}\server\solr-webapp\webapp\WEB-INF\classes
文件夹下
IKAnalyzer.cfg.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!-- 配置是否加载默认词典 -->
<entry key="use_main_dict">true</entry>
<!-- 配置自己的扩展字典,多个用分号分隔 -->
<entry key="ext_dict">ext.dic;</entry>
<!-- 配置自己的扩展停止词字典,多个用分号分隔 -->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
这一步是用来配置自定义分词和自定义停词的,一些专有名词,我们希望它能够作为独立的词条,这叫做扩展词;一些助词,谓词我们不希望它被作为词条,这叫停词。停词就是不作为搜索条件,扩展词可以搜索
1.4.5.2 同义词配置
为了让例子简单,我们假设索引库只有两个字段。
在 server\solr\新建的core文件夹\conf\
文件夹下的managed-schema
中修改
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false" />
<fieldType name="my_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false" />
</analyzer>
</fieldType>
在相同的conf目录下的 synonyms.txt 中增加
你好 => 你们好
中国 => 中华
中国 => 大夏
1.4.6 重启验证
重启solr
服务solr.cmd restart -p 8983
验证
- 打开solr本地地址:
http://127.0.0.1:8983/solr
- 分词界面中有text_ik这个选项就说明已经添加成功了, 如下图所示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了