第 13 章 管理索引
通过索引(索引)通过对属性或值进行分类和检索信息,可以更轻松地搜索和检索信息。本章描述了搜索算法本身,将索引机制放在上下文中,然后描述了如何创建、删除和管理索引。
13.1. 关于索引 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
本节概述目录服务器中的索引。它包含以下主题:
13.1.1. 关于索引类型 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
索引存储在目录数据库中的文件中。文件的名称基于 indexed 属性,而不是文件中包含的索引类型。如果为特定属性维护多个索引,每个索引文件可以包含多个索引类型。例如,为 common 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)'
# 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
# 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 加入来合并。每个过滤器组件都独立处理,并返回 ID 列表。
- 如果条目 ID 列表大于配置的 ID 列表扫描限制,或者没有为属性定义索引,则 Directory 服务器会将此 filtercomponent 的结果设置为 allids。如果对单个搜索组件的结果应用逻辑操作后,列表仍然是 ALLIDs,它会在数据库中搜索每个条目。这是一个 未索引的 搜索。
- Directory 服务器从
id2entry.db
数据库读取每个条目,或 ID 列表中每个条目 ID 的条目缓存(或从整个数据库中为未索引搜索的整个数据库读取条目缓存)。然后,服务器会检查条目以查看它们是否与搜索过滤器匹配。每个匹配项都会在找到时返回。服务器会继续 ID 列表,直到它搜索所有候选条目或直到它达到配置的资源限值之一。(资源限值在 第 14.5.3 节 “使用命令行设置用户和全局资源限值” 中列出。)注意可以设置单独的资源限值,以使用简单页面的结果控制进行搜索。例如,管理员可以通过页面搜索设置高或无限大小并查找限制,但对非页搜索使用较低的默认限值。
13.1.4. 大约搜索 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
此外,目录使用 metaphone phonetic 算法的变体对大约索引执行搜索。每个值都被视为单词序列,为每个单词生成手机代码。
注意
目录服务器中的元手机算法只支持 US-ASCII 字母。因此,只使用带有英语值的大约索引。
在大约搜索中输入的值将转换为一系列手机代码。如果这两个条目都为 true,则考虑与查询匹配:
- 所有查询字符串代码都与条目字符串中生成的代码匹配。
- 所有查询字符串代码都与条目字符串代码相同。
目录(电话代码)中的名称. | 查询字符串(电话代码) | 匹配评论 |
---|---|---|
alice B Sarette (ALS B SRT) | alice Sarette (ALS SRT) | 匹配.代码以正确顺序指定。 |
Alice Sarrette (ALS SRT) | 匹配.代码以正确顺序指定,尽管 Sarette 拼写错误。 | |
Surette (SRT) | 匹配.生成的代码存在于原始名称中,尽管 Sarette 拼写错误。 | |
Bertha Sarette (BR0 SRT) | 无匹配项。代码 BR0 不在原始名称中。 | |
Sarette, alice (SRT ALS) | 无匹配项。代码没有以正确顺序指定。 |
13.1.5. 平衡索引的好处 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
在创建新索引前,平衡维护对成本的索引的好处。
- 大约索引对于通常包含数字的属性(如电话号码)无效。
- 子字符串索引不适用于二进制属性。
- 如果值为大(如用于包含加密数据的照片或密码)的值,则应避免相等索引。
- 在不提高全局搜索性能的情况下,维护搜索中常用的属性索引会增加开销。
- 不索引的属性仍可在搜索请求中指定,但搜索性能可能会显著降级,具体取决于搜索类型。
- 维护的更多索引,所需磁盘空间越多。
索引可能会变得非常耗时。例如:
- Directory 服务器接收添加或修改操作。
- 目录服务器检查索引属性,以确定是否为属性值维护索引。
- 如果创建属性值被索引,则 Directory 服务器从索引中添加或删除新属性值。
- 实际属性值在条目中创建。
例如,Directory 服务器添加该条目:
目录服务器维护以下索引:
cn
(common name)和sn
(surname)属性的平等、大约和子字符串索引。- 为电话号码属性相等和子字符串索引。
- description 属性的子字符串索引。
将该条目添加到目录中时,目录服务器必须执行以下步骤:
- 为 John 和 John Doe 创建
cn
equality 索引条目。 - 为 John 和 John Doe 创建适当的
cn
approximate index 条目。 - 为 John 和 John Doe 创建适当的
cn
子字符串索引条目。 - 为 Doe 创建
sn
equality 索引条目。 - 为 Doe 创建适当的
sn
approximate 索引条目。 - 为 Doe 创建适当的
sn
子字符串索引条目。 - 为 408 555 8834 创建电话号码相等索引条目。
- 为 408 555 8834 创建适当的电话号码子字符串索引条目。
- 为 小部件的 Z238 行 创建适当的 description 子字符串索引条目。为此字符串生成了大量子字符串条目。
如本例所示,为大型目录创建和维护数据库所需的操作数量可能是资源密集型。
13.1.6. 索引限制 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
您不能索引虚拟属性,如
nsrole
和 cos_attribute
。虚拟属性包含计算的值。如果您索引了这些属性,Directory 服务器可以返回一组无效的条目来直接和内部搜索。