第 13 章 管理索引
索引通过分类和整理属性或值来更轻松地搜索和检索信息。本章论述了搜索算法本身,将索引机制放在上下文中,然后描述了如何创建、删除和管理索引。
13.1. 关于索引
本节概述目录服务器中的索引。它包含以下主题:
13.1.1. 关于索引类型
索引存储在目录数据库中的文件中。文件的名称基于 indexed 属性,而不是文件中包含的索引类型。如果为特定属性维护多个索引,则每个索引文件可能会包含多个索引类型。例如,为通用 name 属性维护的所有索引都包含在
cn.db
文件中。
目录服务器支持以下类型的索引:
- 存在索引(pres) 包含包含特定属性的条目列表,这对于搜索非常有用。例如,它可以轻松地检查包含访问控制信息的任何条目。生成包含存在索引的
aci.db
文件会有效地执行 ACI = the 搜索,以便为服务器生成访问控制列表。 - 平等索引(eq) 改进了对包含特定属性值的条目的搜索。例如,
cn
属性上的相等索引允许用户更有效地执行 cn=Babs Jensen 的搜索。 - 大约索引(approx) 用于 高效的类似声音或声音 的搜索。例如,条目可能包含属性值 cn=Firstname M Lastname。大约搜索将返回针对 cn~=Firstname Lastname, cn~=Firstname, or cn~=Lastname 进行搜索的值。同样,对 l~=San Fransisco 的搜索会返回包括 l=San the 的条目。
- 子字符串 索引(sub) 是维护的成本索引,但它可以有效地搜索条目中的子字符串。子字符串索引仅限于每个条目至少有三个字符。例如,搜索 cn=*derson ,它会匹配包括如 Bill Anderson, Jill Henderson, 或 Steve Sanderson 字符串的常规名称。同样,搜索 telephoneNumber= *555* 会返回目录中包含 555 的电话号码的所有条目。
- 国际索引 加快了搜索国际目录中的信息。创建国际索引的过程与创建常规索引的过程类似,不同之处是它会应用一个匹配规则,它将一个 对象标识符 (OID) 与要索引的属性关联。附录 D, 国际化 中列出了支持的区域设置及其关联的 OID。如果需要配置目录服务器以接受其他匹配规则,请联系红帽咨询。
13.1.2. 关于默认和数据库索引
目录服务器包含一组默认索引。创建新数据库时,Directory 服务器会将这些默认索引从 cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config 复制到新数据库。然后,数据库只使用这些索引的副本,它们存储在 cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config 中。
注意
目录服务器不会复制 cn=config 条目中的设置。因此,您可以在作为复制拓扑一部分的服务器上配置索引。例如,在使用级联复制的环境中,如果客户端不需要从 hub 读取数据,则不需要在 hub 上创建自定义索引。
显示目录服务器默认索引:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com \ -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" \ '(objectClass=nsindex)'
注意
如果您更新存储在 cn=default index ,cn=config,cn=ldbm database,cn=plugins,cn=config 里的默认索引 设置,则更改不会应用到 cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config。
显示单个数据库的索引:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list database_name
13.1.3. 搜索算法概述
索引用于加快搜索速度。要了解目录如何使用索引,它有助于理解搜索算法。每个索引包含一个属性列表(如
cn
、通用名称、属性)以及包含索引属性值的条目的 ID 列表:
- LDAP 客户端应用程序向目录发送搜索请求。
- 目录检查传入请求,以确保指定的基本 DN 与一个或多个数据库或数据库链接中包含的后缀匹配。
- 如果匹配,目录会处理请求。
- 如果不匹配,目录会向客户端返回错误,表示后缀不匹配。如果在 cn=config 下的 nsslapd-referral 属性中指定引用,则目录也会返回 LDAP URL,客户端可以尝试识别请求。
- 目录服务器检查搜索过滤器,以查看要应用的索引,它会尝试从满足过滤器的每个索引中加载条目 ID 列表。ID 列表会根据使用的 AND 或 OR joins 的组合。每个过滤器组件都可以独立处理并返回 ID 列表。
- 如果条目 ID 列表大于配置的 ID 列表扫描限制,或者没有为属性定义索引,那么目录服务器会将 此过滤器组件 的结果设置为 所有辅助。如果将逻辑操作应用到单个搜索组件的结果后,列表仍然为 ALLIDs,它会搜索数据库中的每个条目。这是一个 未索引的 搜索。
- 目录服务器从
id2entry.db
数据库或 ID 列表中每个条目 ID (或整个数据库进行未索引搜索)读取每个条目。然后,服务器会检查条目以查看它们是否与搜索过滤器匹配。每个匹配项都会在找到时返回。服务器将继续通过 ID 列表,直到它搜索所有候选条目,或直至达到其中一个配置的资源限值。(资源限值在 第 14.5.3 节 “使用命令行设置用户和全局资源限值” 中列出。)注意可以使用简单的页面结果控制为搜索设置单独的资源限值。例如,管理员可以通过页面搜索设置高或无限的大小,但对非页面搜索使用较低默认限制。
13.1.4. 大约搜索
此外,该目录使用元手机电话号码算法的变体来对大约索引执行搜索。每个值都被视为一个单词序列,每个单词都会生成一个电话号码代码。
注意
目录服务器中的元电话号码算法仅支持 US-ASCII 字母。因此,仅使用带有英语值的大约索引。
在辅助搜索中输入的值类似,被转换为一系列电话号码代码。如果这两个条目都为 true,则条目被视为与查询匹配:
- 所有查询字符串代码都与条目字符串中生成的代码匹配。
- 所有查询字符串代码都与条目字符串代码相同。
目录中的名称(图形代码) | 查询字符串(复合代码) | 匹配注释 |
---|---|---|
alice B Sarette (ALS B SRT) | alice Sarette (ALS SRT) | 匹配。代码以正确顺序指定。 |
alice Sarrette (ALS SRT) | 匹配。代码以正确顺序指定,尽管出现拼写错误。 | |
Surette (SRT) | 匹配。生成的代码存在于原始名称中,尽管出现拼写错误。 | |
Bertha Sarette (BR0 SRT) | 无匹配项。原始名称中不存在代码 BR0。 | |
Sarette、SRT (SRT ALS) | 无匹配项。代码不会以正确顺序指定。 |
13.1.5. 平衡索引性
在创建新索引前,平衡维护索引的好处。
- 大约索引对于通常包含数字的属性(如电话号码)效率不有效。
- 子字符串索引不适用于二进制属性。
- 如果值较大(如旨在包含黄金数据或密码包含加密数据的属性),则应该避免平等索引。
- 为搜索中常用的属性维护索引会增加开销,而不会提高全局搜索性能。
- 未索引的属性仍可在搜索请求中指定,但搜索性能可能会显著降级,具体取决于搜索的类型。
- 您维护的更多索引,需要更多磁盘空间。
索引可能会变得非常耗时。例如:
- 目录服务器收到添加或修改操作。
- 目录服务器检查索引属性,以确定是否为属性值维护索引。
- 如果索引了创建的属性值,则 Directory 服务器会从索引中添加或删除新属性值。
- 实际的属性值在条目中创建。
例如,Directory 服务器添加了条目:
dn: cn=John Doe,ou=People,dc=example,dc=com objectclass: top objectClass: person objectClass: orgperson objectClass: inetorgperson cn: John Doe cn: John sn: Doe ou: Manufacturing ou: people telephoneNumber: 408 555 8834 description: Manufacturing lead for the Z238 line of widgets.
目录服务器维护以下索引:
cn
(通用名称)和sn
(surname)属性的等同性、大约和子字符串索引。- 电话号码属性的相等和子字符串索引。
- description 属性的子字符串索引。
在目录中添加该条目时,Directory 服务器必须执行以下步骤:
- 为 John 和 John Doe 创建
cn
相等索引条目。 - 为 John 和 John Doe 创建适当的
cn
大约索引条目。 - 为 John 和 John Doe 创建适当的
cn
子字符串索引条目。 - 为 Doe 创建
sn
相等索引条目。 - 为 Doe 创建适当的
sn
大约索引条目。 - 为 Doe 创建适当的
sn
子字符串索引条目。 - 为 408 555 8834 创建电话号码相等的索引条目。
- 为 408 555 8834 创建适当的电话号码子字符串索引条目。
- 为 Manufacturing 创建适当的描述子字符串索引条目,导致小部件的 Z238 行。为此字符串生成了大量子字符串条目。
如本例所示,为大型目录创建和维护数据库所需的操作数量可能是资源密集型。
13.1.6. 索引限制
您无法索引虚拟属性,如
nsrole
和 cos_attribute
。虚拟属性包含计算的值。如果您索引这些属性,Directory 服务器可以返回一组无效的条目来直接和内部搜索。