Solr之基础讲解入门

1 Solr

1.1 简介

Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供RESTHTTP/XMLJSONAPI,本教程以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.shsolr.in.cmd
      这些分别是为 Linux 和 Windows 系统提供的属性文件。在这里配置了 Java、Jetty 和 Solr 的系统级属性。许多这些设置可以在使用 bin/solr 或者 bin/solr.cmd 时被覆盖,但这允许你在一个地方设置所有的属性。
    • install_solr_services.sh
      该脚本用于Linux 系统以安装 Solr 作为服务
  • contrib
    Solrcontrib 目录包含 Solr 专用功能的附加插件。
  • dist
    dist 目录包含主要的 Solr.jar 文件。
  • docs
    docs 目录包括一个链接到在线 Javadocs 的 Solr。
  • example
    example 目录包括演示各种 Solr 功能的几种类型的示例
  • licenses
    licenses 目录包括 Solr 使用的第三方库的所有许可证。
  • server
    此目录是 Solr 应用程序的核心所在。此目录中的 README 提供了详细的概述,但以下是一些特点:
    • SolrAdmin UIserver/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: namefield 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.jarjar包内的配置文件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

验证

  1. 打开solr本地地址: http://127.0.0.1:8983/solr
  2. 分词界面中有text_ik这个选项就说明已经添加成功了, 如下图所示:
    在这里插入图片描述
posted @ 2022-06-10 16:28  上善若泪  阅读(357)  评论(0编辑  收藏  举报