第 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 列表:
  1. LDAP 客户端应用程序向目录发送搜索请求。
  2. 目录检查传入请求,以确保指定的基本 DN 与一个或多个数据库或数据库链接中包含的后缀匹配。
    • 如果匹配,目录会处理请求。
    • 如果不匹配,目录会向客户端返回错误,表示后缀不匹配。如果在 cn=config 下的 nsslapd-referral 属性中指定引用,则目录也会返回 LDAP URL,客户端可以尝试识别请求。
    • 目录服务器检查搜索过滤器,以查看要应用的索引,它会尝试从满足过滤器的每个索引中加载条目 ID 列表。ID 列表会根据使用的 AND 或 OR joins 的组合。
      每个过滤器组件都可以独立处理并返回 ID 列表。
    • 如果条目 ID 列表大于配置的 ID 列表扫描限制,或者没有为属性定义索引,那么目录服务器会将 此过滤器组件 的结果设置为 所有辅助。如果将逻辑操作应用到单个搜索组件的结果后,列表仍然为 ALLIDs,它会搜索数据库中的每个条目。这是一个 未索引的 搜索。
  3. 目录服务器从 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. 平衡索引性

在创建新索引前,平衡维护索引的好处。
  • 大约索引对于通常包含数字的属性(如电话号码)效率不有效。
  • 子字符串索引不适用于二进制属性。
  • 如果值较大(如旨在包含黄金数据或密码包含加密数据的属性),则应该避免平等索引。
  • 为搜索中常用的属性维护索引会增加开销,而不会提高全局搜索性能。
  • 未索引的属性仍可在搜索请求中指定,但搜索性能可能会显著降级,具体取决于搜索的类型。
  • 您维护的更多索引,需要更多磁盘空间。
索引可能会变得非常耗时。例如:
  1. 目录服务器收到添加或修改操作。
  2. 目录服务器检查索引属性,以确定是否为属性值维护索引。
  3. 如果索引了创建的属性值,则 Directory 服务器会从索引中添加或删除新属性值。
  4. 实际的属性值在条目中创建。
例如,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 服务器必须执行以下步骤:
  1. JohnJohn Doe 创建 cn 相等索引条目。
  2. JohnJohn Doe 创建适当的 cn 大约索引条目。
  3. JohnJohn Doe 创建适当的 cn 子字符串索引条目。
  4. Doe 创建 sn 相等索引条目。
  5. Doe 创建适当的 sn 大约索引条目。
  6. Doe 创建适当的 sn 子字符串索引条目。
  7. 408 555 8834 创建电话号码相等的索引条目。
  8. 408 555 8834 创建适当的电话号码子字符串索引条目。
  9. 为 Manufacturing 创建适当的描述子字符串索引条目,导致小部件的 Z238 行。为此字符串生成了大量子字符串条目。
如本例所示,为大型目录创建和维护数据库所需的操作数量可能是资源密集型。

13.1.6. 索引限制

您无法索引虚拟属性,如 nsrolecos_attribute。虚拟属性包含计算的值。如果您索引这些属性,Directory 服务器可以返回一组无效的条目来直接和内部搜索。