Solr入门学习(三)—— 认识 schema

Server : Ubuntu 16.04
Java Version : 1.8
Solr Version : 7.4.0

前言

《Solr入门学习(一)—— Solr 的安装、启动与关闭》 一文中,有提到每个集合都需要指定一个 configSet,且这个 configSet 至少要包含两个主要的配置文件: schema 文件和 solrconfig.xml 文件。其中的 schema 文件就是我们本章所要介绍的内容。


一、何为 schema?

在 Solr 的官方文档中,是这么介绍 schema 的:

Solr’s schema is a single file (in XML) that stores the details about the fields and field types Solr is expected to understand.

可以这么理解,schema 文件就是一个定义了索引字段、索引数据类型等信息的配置文件。它位于对应 configSet 目录下的 conf 文件夹中,通常被命名为 managed-schemaschema.xml。例如,在 Solr 默认的配置集 _default 中,其 schema 文件的位置为 ../solr-7.4.0/server/solr/configsets/_default/conf

需要注意的是,上面所述的 schema 文件应该理解为一个模板文件,并非实际的配置文件。 当我们创建一个集合时,Solr 会从指定的 configSet 取得 schema 文件并加载其配置信息到该集合中。这意味着,每个集合都有一份属于自己的 schema 文件,而 configSet 中的 schema 文件只是用于提供初始的配置信息而已。所以,当我们对集合的 schema 文件中做修改时,会发现 configSet 中的 schema 文件并不会随之修改。

这里还需要注意的一个点是,如果我们是使用 cloud 模式启动 Solr 的,那么每个集合的 schema 文件是存储在 zookeeper 中的,我们只需连接到 zookeeper,即可在 /configs/${collection_name} 路径下找到 managed-schema 文件。


二、schema 核心标签

回想一下,在关系型数据库中,数据入库前都需要预先完成字段命名、字段类型确认、字段长度设置等工作。同样地,在 Solr 中,每个集合在为数据建立索引前,也需要预先定义好字段与字段类型等,而这部分工作通过 schema 文件中的标签来完成。(注:此步骤又非必须的,具体原因见以下内容)

在 schema 文件中,有以下 4 种核心标签:

1. field

field 表示字段,相当于 Java 中的类成员变量。在 Solr 中,通过 schema 的 field 标签对字段进行定义。field 标签示例如下:

<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>

field 标签的常见属性可见下表:

属性名属性说明
name字段名称
type字段类型,对应 fieldType
default字段默认值
indexed该字段数据是否进行索引,默认为 false
stored该字段数据是否进行存储,默认为 false
multiValued该字段是否有多个值,默认为 false
required该字段是否为必填项,默认为 false

2. fieldType

fieldType 表示字段类型,相当于 Java 中的数据类型。在 Solr 中,通过 schema 的 fieldType 标签对字段类型进行定义。fieldType 标签示例如下:

<fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true"/>

正如我们在 field 标签常见属性表所看到的,field 标签的 type 属性对应 fieldType 标签的 name 属性。

3. dynamicField

顾名思义,dynamicField 表示动态字段。当我们忘记定义某个字段或者现有配置无法满足业务新增的字段时,dynamicField 可以起到很大的作用。因为它可以借助通配符 *,实现字段的动态匹配。

一个 dynamicField 标签示例如下:

<dynamicField name="*_i" type="int" indexed="true"  stored="true"/>

它定义了一个名为 *_i 的动态字段,当我们想要新增一个 fieldTypeint 类型的字段而又不想在 schema 中新增一个 field 时,可以将字段命名为 age_i* 可用任意字符代替)使其与该动态字段匹配。

4. copyField

copyField 是一种特殊的 field,它的作用在于将一个 field 的数据复制到另一个 field 中。

我们首先来看一个示例:

<schema name="example" version="1.6">
    <!-- field -->
    <field name="title" type="text" indexed="true" stored="false"/>
    <field name="description" type="text" indexed="true" stored="false"/>
    <field name="text" type="text" indexed="true" stored="false"  multiValued="true"/>
    <!-- copyField -->
    <copyField source="title" dest="text"/>
    <copyField source="description" dest="text"/>
</schema>

在示例中,有三个字段 titledescriptiontext,前两者分别表示文章的标题和摘要。此外,示例中配置了两个 copyField,其作用就是将 title 字段和 description 字段的值复制到 text 字段中。当 Solr 要为一篇文章添加索引时,首先会为 title 字段和 description 字段建立索引,然后将 titledescription 的内容复制合并后赋予 text 字段。

那么,这有什么作用呢?

我们举个例子。假设现在有一个需求,需要从库中筛选出标题、摘要或正文中含有某个关键词的文章,那么我们该怎么做?一个解决方案就是,建立一个复制了标题、摘要、正文等全部内容的字段,这样当我们进行关键词检索时,即可通过该字段快速达到目的。

不过,显而易见,copyField 的这种特性是需要耗费存储资源的。


三、schemaless 模式

在上面的内容里,我们已经知道了在建立索引前需要定义字段。那么,假如我们不定义字段呢?索引是否还能成功建立?

答案是可以。

Solr 有一个 schemaless 模式,可以根据索引数据猜测其数据类型并构建 schema,使用户无需定义字段即可快速建立索引。

例如,当我们要索引如下数据:

{
    'age':18
}

Solr 会猜测该字段属于数字类型,并自动在 schema 中添加如下定义:

<field name="age" type="plongs"/>

这看起来似乎是一个非常好的功能,但实际上,Solr 的字段猜测并不是一个可靠的功能,一旦它在初始时候猜测错误,很有可能导致后面的数据索引失败。


四、schema 配置

在 7.4.0 版本,schema 文件中有如下一段注释:

<!-- Solr managed schema - automatically generated - DO NOT EDIT -->

说明官方是不提倡手动编辑配置 schema 文件的。那么还有什么方式可以对 schema 文件进行配置呢?查阅官方文档,发现有以下两种方式:

1. use the Admin UI

在 Solr 的管理页面中,我们先选中目标集合,再选择集合下的 schema 选项,会弹出如下界面:

image

点击 Add Field 按钮,对字段名称、类型、默认值等进行配置,点击确认按钮即可完成 field 的添加。

image

2. use the Schema API

我们可以在命令行中直接通过 API 完成 schema 的配置,如下所示:

curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field": {"name":"name", "type":"text_general", "multiValued":false, "stored":true}}' http://localhost:8983/solr/films/schema

其中,参数 -X 指定请求方式(如 POST),参数 -H 表示请求头,参数 --data-binary 表示以二进制的方式 post 数据。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值