solr快速上手:managed-schema标签详解(三)

news2024/11/27 6:37:34

0. 引言

core核心是solr中的重中之重,类似数据库中的表,在搜索引擎中也叫做索引,在solr中索引的建立,要先创建基础的数据结构,即schema的相关配置,今天继续来学习solr的核心知识:

solr快速上手:solr简介及安装(一)

solr快速上手:核心概念及solr-admin界面介绍(二)

1. schema标签

schema实际上就是solr核心的数据结构,即字段的定义集。

在solr安装目录下,有这样一个文件夹server/solr/configsets/_default/conf,里面附带了要创建索引的默认的基础配置文件。我们可以通过复制这个文件夹下的配置文件,来帮助我们快速创建索引

这些文件中有两个核心的配置文件需要我们掌握:

  • menaged-schema: 字段配置文件
  • solrconfig.xml:solr核心配置文件
    在这里插入图片描述

但在我们真正开始创建之前,还是要先学习其中schema的常用标签

首先我们需要知道,我们字段结构的定义都是在managed-schema文件中的,当然有时我们能看到又使用的是schema.xml文件,这是因为solr提供了两种定义模式,默认使用managed-schema,如果需要使用schema.xml,则需要在solrconfig.xml中配置如下标签

<schemaFactory class="ClassicIndexSchemaFactory"/>

通过上述文件夹中复制下来的managed-schema已经有各类标签的使用案例了,只不过都是注释的,我们来详细看看几个常用的标签:

<schema name="example" version="1.5">
   
    <field name="id" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
    ...

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

    <uniqueKey>id</uniqueKey>
	
	<copyField source="sourceFieldName" dest="destinationFieldName"/>

    <fieldtype name="textSimple" class="solr.TextField">
        <analyzer>
            <tokenizer class="org.lionsoul.jcseg.solr.JcsegTokenizerFactory" mode="detect"/>
        </analyzer>
    </fieldtype>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
    ...
</schema>

1.1 field 字段标签

filed标签用于配置字段信息,该标签中包含如下属性:

  • name: 字段名称,值要求唯一
  • type: 字段数据类型

支持哪些常用的数据类型
string 字符串
int, long 整数
float, double 浮点数
date 日期时间
bool 布尔类型
text 文本类型
binary 二进制类型

  • indexed: 当前字段是否创建索引,默认值为true

这里的索引指的是什么?
因为solr使用倒排索引,所以创建索引的含义,就是将字段值包含在倒排索引中,也就是用该值分词创建倒排索引,从而支持基于该字段的搜索和过滤。

创建索引的好处和坏处?
好处是提高了查询小了,坏处当然是增加了存储空间占用,而且当字段值本身很大时,创建索引也会带来一定的性能损耗。因此在指定索引字段时,也要综合考虑。

  • stored: 当前字段是否存储,默认为true

是否存储,指的是存储到哪里?
配置该字段的值是否存储到solr本身的存储库中,如果存储,那么当查询后的显示就不需要再查询数据源了,对于只需要排序、索引的字段,则可以设置为false来节约空间

比如设置indexed=true, stored=false, 则表示该字段值用于创建索引,但不做存储吗?
是的,该字段值不做存储,但是值会被分词用于创建倒排索引,如此当查询的结果需要再显示该字段时,就需要再次查询数据源来显示,而查询数据源本身是相对较慢的操作

这里的数据源到底指的是什么?
solr的数据源可能是数据库、文件、接口等,比如配置了solr数据是从mysql通过dataimport同步过来了,那么数据源就是mysql,查询数据源就表示通过sql再查一遍mysql,所以速度自然就慢

stored=true的好处和坏处?
好处是提高读取性能,直接存储在solr了,无需再从数据源获取,提高查询效率;坏处当然是占用磁盘空间,对于海量的数据时,如果不需要显示,仅仅只是做索引则不用存储,存储也意味着更高的磁盘、网络IO

  • docValues: 是否启用点列存储当前字段值,默认为false, 当需要字段做排序或者聚合查询时需要设置为true

什么是点列存储?
点列存储(也叫列存储)是倒排索引之外的一种存储结构,我们更加熟悉的是数据库的行存储,但实际上像oracle,sqlserver都已经在支持列存储,列存储是指的是按照列来进行分组存储
比如我们有如下的几行数据

nameagesexaddressschool
张三28广州市xxx路南京大学
李四18北京市xxx路湖南大学
丽丽19福州市xxx路江南大学

这几个数据按行存储的话,在磁盘中的存储方式如下所示
同一行的数据是放在一起的
在这里插入图片描述
而列存储的话,就是同一列的数据放在一起
在这里插入图片描述
这样存储的好处在于当我们需要对年龄进行分组的时候,我们就不需要把全部数据查询一遍,而只需要找到对应列的位置,然后将这一连续空间的数据查询出来,进行聚合操作即可
这样的存储方式,极大的方便了针对数值型字段聚合、重复度高的字段分组、需要排序的字段的查询操作
并且联想一下,针对数值列,重复度高的列,我们还可以进行压缩操作,更加节约存储空间

上述图形中,姓名、地址、学校这些字段也按列存储了,是不是造成浪费了?
其实有这个问题,你大概率是陷入了误区,上述是为了给大家展示按列存储的物理结构,实际的操作时,我们是按需定义的,不要忘记这个属性是在field标签下的,也就是说他是针对某一列设置是否按列存储,所以如果不需要的字段,你不设置即可

  • multiValues: 字段值是否可重复,或者说是否为多个值,默认为false。一般用于数组字段

比如如下的数据中,技能字段skills就是一个数组类型,就需要用multiValues=true标识

{
  "name": "张三",
  "age": 28,
  "sex": "男",
  "address": "广州市xxx路",
  "school": "南京大学",
  "skills": [
      "Java",
      "Python",
      "C++",
      "数据结构与算法"
  ]
}

默认字段

基于以上的属性我们就可以自定义字段了,但同时solr也提供了一些默认的字段,也称为域

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

    <field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
  
    <field name="_nest_path_" type="_nest_path_" /><fieldType name="_nest_path_" class="solr.NestPathField" />

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

如上所示,其中包括:

  • id: 文档的唯一标识符,可以指定为数据源中的唯一索引字段
  • _version_: 版本号,用于并发控制,每次更新文档,版本值都会自动递增
  • _root_: 用于嵌套文档结构,表示潜逃文档所属的最外层文档
  • _nest_path_: 用于嵌套文档结构,表示嵌套文档在文档中的路径,可以根据该路径来查询嵌套文档
  • _text_: 文档的主要内容,用于全文检索

假设有如下文档值:

{
  "id": "001",
  "title": "Solr 学习笔记",
  "content": "这是一篇关于 Solr 的学习笔记,包含了 Solr 的介绍、安装、配置和使用等内容。"
}

则对应的这几个字段的值是:

{
  "id": "001",        // 文档唯一标识符
  "_version_": 1,     // 并发控制版本号
  "_root_": "001",    // 嵌套文档根节点(此处与id相同)
  "_nest_path_": "",  // 嵌套文档路径(顶级文档为空字符串)
  "_text_": [         // 全文检索内容
    "这是一篇关于 Solr 的学习笔记,包含了 Solr 的介绍、安装、配置和使用等内容。",
    "Solr 学习笔记"
  ]
}

比如有点赞信息时,就会引入嵌套文档

{
  "id": "002",
  "title": "Solr 文档结构示例",
  "content": "这是一篇 Solr 文档嵌套结构的示例。",
  "_root_": "002",   // 根节点为自己
  "_nest_path_": "", // 初始情况下为空字符串
  "_text_": [
    "这是一篇 Solr 文档嵌套结构的示例。",
    "Solr 文档结构示例"
  ],
  "like": [          // 嵌套文档:点赞
    {
      "id": "u001",
      "user_name": "Tom",
      "_root_": "002",          // 父文档ID
      "_nest_path_": "/like",   // 嵌套路径为 /like
      "_text_": ["Tom"]
    },
    {
      "id": "u002",
      "user_name": "Jack",
      "_root_": "002",          // 父文档ID
      "_nest_path_": "/like",   // 嵌套路径为 /like
      "_text_": ["Jack"]
    }
  ]
}

1.2 dynamicField 动态字段标签

动态字段是用来做什么的?
当我们出现部分字段名都是类似的,且表示相同的含义时,比如:name_1, name_2, name_3 ,如果有成百上千个这样的字段需要定义,还是很麻烦的,可能你觉得不会有这样的场景,但是在搜索引擎的业务场景下,存在大批量字段是比较常见的事情。

这个时候,我们就希望能有一个类似通配符匹配配置的模式,来帮助我们批量定义字段,于是就出现了动态字段,比如上述的name_1, name_2, name_3 我们就可以定义为:

<dynamicField name="name_*"  type="pint"  indexed="true"  stored="true"/>

动态字段只能有前缀和后缀两种匹配模式,用*来表示

同时需要注意,在solr中,只有在managed-schema文件中配置过的字段,才能在查询时使用,这与数据库的逻辑是一致的,没有定义过的字段,直接使用就会报错"字段未找到"

1.3 uniqueKey 唯一主键标签

solr中默认使用id作为唯一主键,更新和新增时就通过唯一主键是否存在来决定

1.4 copyField 复制字段标签

复制字段的意思就是将一个或多个字段的值填充到另一个字段中,主要用来:

  • 将多个字段填充到一个字段方便搜索;

如果目标字段中已经有自己的数据,那么会把复制字段的内容作为附加值添加到目标字段的内容中,从而实现更加全面的搜索覆盖

<copyField source="name" dest="search_total"/>
<copyField source="content" dest="search_total"/>
<copyField source="title" dest="search_total"/>
  • 对同一个字段定义不同的分词器,用于不同的搜索场景

比如将某字段值,定义英文分词器,中文分词器,西巴牙语分词器,以应对不同语种的搜索场景

<copyField source="name" dest="name_english"/>
<copyField source="name" dest="name_chinese"/>

1.5 fieldType 字段类型标签

filedType标签主要用于定义字段的分词器、过滤器,实现为不同字段定义不同的分词、过滤器

相当于是定义一个字段类型,然后在类型中指定使用的类,然后在field标签中就可以直接使用这个自定义的类型

如下示例,就定义了一个类型my_text,定义了两个分析器,一个用于索引(index),一个用于查询(query),都是用StandardTokenizerFactory作为默认的分词器,StopFilterFactory作为过滤器,分别用于去除标点和停用词。不同的是查询时额外使用了SynonymGraphFilterFactorysynonyms.txt获取同义词

PS:

1、solr有哪些分词器和过滤器,我们将在后续讲解,或者大家也可自行拓展搜索,中文中还有常用的中文分词器——IK分词器
2、不清楚同义词、过滤器、停用词作用的,因为是搜索引擎的基础概念,大家可自行搜索,如果仍不清楚,可留言提问

<fieldType name="my_text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

filedType标签中常用的属性如下:

  • name: 定义类型名称
  • class: 定义类型使用的class类,比如text类型的用的就是solr自带的TextField类
  • positionIncrementGap 属性指定了位置增量间隔,用于多值字段在索引中处理位置信息,默认是0,也就是每个分词之间存储的间隔

默认为0的话,比如这样的文档:

<doc>
	<filed name="id">1</field>
	<filed name="content">wu quick study</field>
	<filed name="content">solr study</field>
</doc>

如果针对content字段设置的fieldType指定了默认positionIncrementGap=0,那么content的位置编号就是:

位置编号文本
1wu quick study
2solr study

如果设置的positionIncrementGap=10,则位置编号为,及文本不是连续存储的

位置编号文本
1wu quick study
11solr study

设置positionIncrementGap的好处和坏处?
设置后可以控制多值字段不同值之间的位置增量,这样solr可以更加准确的计算匹配文档和查询相关度,从而计算结果排名,简言之就是查询的结果排名计算更加准确。当然他的坏处就是占用的空间变大,使得索引变大,那么查询性能就受到影响了

其次,fieldType也支持filed中的以下标签:

indexed:是否可以被索引,默认为 true。
stored:是否可以被存储,默认为 true。
multiValued:是否为多值字段,默认为 false。
docValues:是否启用 DocValues,默认为 false。
termVectors:是否启用 TermVectors,默认为 false。

2. 总结

今天,我们针对schema标签的详解就到此结束了,是不是感觉标签属性很多,记不过来,其实没关系,实际使用部分标签是用不到的,我们还可以根据模版参考配置,无需专门背诵,根据实际场景,多写几遍,自然就记住了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python绑定CPU:提高性能的利器

Python 绑定 CPU&#xff1a;提高性能的利器 介绍 Python 作为一门通用编程语言&#xff0c;具有易学易用、开发效率高等优点&#xff0c;但由于其解释型的特性&#xff0c;执行效率相对较低&#xff0c;尤其是在处理大量计算时&#xff0c;性能瓶颈更为明显。在这种情况下&a…

chatgpt赋能python:用Python发送短信的简单方法

用Python发送短信的简单方法 在今天的数字时代&#xff0c;没有任何事情比即时通讯更方便。然而&#xff0c;短信仍然是一种极为有用的通信方式。 实际上&#xff0c;正如您所看到的&#xff0c;本文将告诉您如何使用Python在几步内轻松地发送短信。 发送短信的三种方法 要发…

Unity之TileMap

1、创建瓦片资源 教程中老师在Asset---Create---Tile创建&#xff0c;但是新版本Unity不能这样创建 新版本是在Asset---Create---2D--Tile里面选择&#xff0c;跟老师的不太一样&#xff0c;暂时也不懂怎么解决 所以我们可以用方法二创建&#xff1a; 在Window---2D---Tile…

Linux---phy外设调试(二)

文章目录 一、mdio与rmii/sgmii二、主控mac控制器配置三、phy driver与device的匹配规则 一、mdio与rmii/sgmii 接上一篇文章《Linux—phy外设调试&#xff08;一&#xff09;》&#xff0c;在上一篇中我们说到我们还遗留了几个问题没有解释&#xff0c;其中提到的有mdio总线和…

海量数据中找出前k大数(topk问题),一篇文章教会你

&#x1f4af; 博客内容&#xff1a;【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&…

[极客大挑战 2019]PHP1

既然提到了备份网站估计也是存在着网站备份文件&#xff0c;可以先用御剑扫一下 啥都没扫出来&#xff0c;但是上回做文件备份的题目时收集了一些关于常用备份文件的文件名和后缀&#xff0c;可以直接使用burp抓包爆破&#xff0c;果然爆破出一个www.zip文件 访问下载好文件就有…

电子科技大学编译原理复习笔记(四):程序语言的设计

目录 前言 重点一览 语言的定义 比较&#xff1a;生成观点与识别观点 语义又该怎么描述&#xff1f; 符号串 符号串集合 ⭐文法&#xff08;超重点&#xff09; 定义 组成 表示 ⭐分类&#xff08;重点&#xff09; 文法产生的语言 ⭐短语、直接短语和句柄&…

幂等问题解决

什么是幂等性&#xff1f; 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在数学中&#xff0c;主要有两个定义 如果在一元运算中&#xff0c;x 为某集合中的任意数&#xff0c;如果满足 f(f(x))f(x)&#xff0…

软件质量测试笔记-合工大

第一章 软件质量和测试背景 应从以下几个方面考虑软件质量&#xff1a; 软件结构功能与性能开发标准与文档 IEEE关于软件质量的定义&#xff1a; 系统&#xff0c;部件&#xff0c;过程满足规定需求的程度系统&#xff0c;部件&#xff0c;过程满足顾客或者用户需要的期望程…

vue css变量实现多主题皮肤切换

实现方式 多主题皮肤切换有很多种实现方式&#xff0c;可以用css预处理器实现&#xff0c;可以用js实现&#xff0c;其实最近简单的一种方式是用css变量(css variable)实现 单页面应用中&#xff0c;可以通过设置body的css变量爱控制整个系统的颜色&#xff0c;body添加一个属…

chatgpt赋能python:Python中的绝对值函数简介

Python中的绝对值函数简介 绝对值是数学中一个基本的概念&#xff0c;在Python中也有相应的函数来实现求绝对值&#xff0c;本文将为大家介绍Python中的绝对值函数及其使用方法。 什么是绝对值 绝对值是一个数的大小&#xff0c;与数本身的符号无关。即如果一个数为正数&…

chatgpt赋能python:自动填写在SEO中的作用

自动填写在SEO中的作用 在SEO中&#xff0c;关键词的密度是非常重要的一项指标。然而&#xff0c;如果手动填写关键词&#xff0c;不仅费时费力&#xff0c;还很容易出现错误。这时候&#xff0c;一款自动填写工具就能够提高效率&#xff0c;减少出错率&#xff0c;从而提高网…

chatgpt赋能python:Python生成Pyd文件的全面指南

Python生成Pyd文件的全面指南 介绍 在Python编程中&#xff0c;我们会发现在某些情况下需要使用C或其他高效语言来提高代码执行速度。在这种情况下&#xff0c;将Python和其他语言混合编程是一个不错的选择。 本指南将介绍如何使用Python生成Python定义的C扩展程序文件 (.py…

[论文分享] jTrans: Jump-Aware Transformer for Binary Code Similarity

jTrans: Jump-Aware Transformer for Binary Code Similarity [ISSTA 2022] 二进制代码相似性检测(Binary code similarity detection, BCSD)在漏洞检测、软件构件分析、逆向工程等领域具有重要应用。最近的研究表明&#xff0c;深度神经网络(DNNs)可以理解二进制代码的指令或…

Solidity基础四

あなたもきっと、誰かの奇跡 &#xff08;你也一定会是某个人的奇迹&#xff09; 目录 一、Solidity的结构体 1.结构体的实例化 2.结构体的基本使用 访问和修改结构体成员 3.结构体的修饰符 二、Solidity的映射 1.映射的基本使用 查询和修改某个value值 三、Solidit…

Jmeter下载安装---Windows系统

Jmeter下载安装---Windows系统 jmeter是什么Jmeter下载安装安装jmeter前置必须jdk8Jmeter下载 jmeter插件环境变量配置 jmeter是什么 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试&#xff1b;在接口及性能测试中广泛使用&…

如何使用JQuery实现Js二级联动和三级联动

前言&#xff1a;使用JQuery封装好的js方法来实现二级三级联动要比直接使用js来实现二级三级联动要简洁很多。所以说JQuery是个非常强大的、简单易用的、兼容性好的JavaScript库&#xff0c;已经成为前端开发人员不可缺少的一部分&#xff0c;是Web开发中最流行的JavaScript库之…

《Spring Guides系列学习》guide61 - guide65

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

mybatisplus递归传递多个参数 | mybatisplus传递多个参数获取层级数据 | mybatisplus传递多个参数获取树形数据

搜索关键字&#xff1a; mybatisplus关联查询传递参数|"select""树形结构"|"select""树形结构""传参"| "select""many""传参"| "select""column""传参" 1、…

chatgpt赋能python:用Python自动操作其他软件优化你的SEO

用Python自动操作其他软件优化你的SEO 作为一名有着10年Python编程经验的工程师&#xff0c;我了解到Python具有强大的自动化功能&#xff0c;可以帮助我们自动化执行任务&#xff0c;节省时间和精力。其中&#xff0c;自动操作其他软件应用案例极为常见&#xff0c;如此&…