Sun Java 徽标     上一章      目录      索引      下一章     

Sun 徽标
Sun Java(TM) System Directory Server 5 2004Q2 管理指南 

第 10 章
创建目录数据的索引

与书的索引一样,Directory Server 通过将搜索字符串与对目录内容的参考相关联来加速搜索过程。索引是属性值构成的表,它们存储在单独的数据库文件中。目录中的每个后缀都会单独创建索引,并进行管理。一旦在后缀配置中创建索引,服务器即会自动维护索引。

有关索引及其利弊的简介、nsslapd-allidsthreshold 属性的说明以及如何提高 Directory Server 性能的说明,请参阅《Directory Server Performance Tuning Guide》Chapter 4 "Tuning Indexing"

本章包含以下小节:


索引概述

在相关数据库目录中以文件方式为每个后缀存储索引。每个索引文件包含后缀中为给定属性定义的所有索引。例如,所有为通用名 (cn) 属性维护的索引均存储在 databaseName_cn.db3 文件中。

初始化后缀或使用本章中所述的命令时会创建索引文件。在客户机搜索操作和内部操作过程中,服务器会访问索引以更快地在目录中查找条目。在修改操作过程中,目录更新目录内容,并通过更新索引文件来维护索引。

Directory Server 支持下列索引类型:

系统索引

系统索引是那些不能被删除或修改的索引。它们是 Directory Server 正常、有效地运作所必需的。下表列出了每个后缀中自动创建的系统索引:

表 10-1 每个后缀中的系统索引

属性

Eq

Pres

目的

aci

 

X

允许 Directory Server 迅速获取目录中维护的访问控制信息。

ancestorid

X

 

包含每个条目的祖先列表。

entrydn

X

 

加快基于 DN 搜索的条目检索。

id2entry

X

 

包含目录条目的实际数据库。所有其他的数据库文件都可以由它来重建。

nsUniqueId

X

 

用于搜索特定条目。

nscpEntryDN

X

 

Directory Server 内部使用,用于复制。

nsds5ReplConflict

X

X

用于帮助查找复制冲突。

numsubordinates

 

X

Directory Server Console 用来增强“目录”选项卡上的显示性能。

objectClass

X

 

用来帮助加快目录中的子树搜索速度。

parentID

X

 

增强单级搜索期间的目录性能。

默认索引

在目录中新建后缀时,服务器在相应的数据库目录中配置一组默认的索引。可以根据索引编制的需要,对默认索引进行修改,但在解除索引配置之前,应该确保企业中没有任何服务器插件或者其他服务器依赖于已编制索引的属性。

要修改新建后缀时将使用的默认索引集,请参阅“修改默认索引集”

下表列出了 Directory Server 中预配置的默认索引:

表 10-2 每个新后缀中的默认索引

属性

Eq

Pres

Sub

目的

cn

X

X

X

改善最常用的用户目录搜索类型的性能。

givenName

X

X

X

改善最常用的用户目录搜索类型的性能。

mail

X

X

X

改善最常用的用户目录搜索类型的性能。

mailAlternateAddress

X

 

 

Sun Java System 由 Messaging Server 使用。

mailHost

X

 

 

Sun Java System 由 Messaging Server 使用。

member

X

 

 

改善 Sun Java System 服务器的性能。引用完整性插件也使用该索引。有关详细信息,请参阅“维护引用的完整性”

nsCalXItemId

X

X

X

由 Sun Java System Calendar Server 使用。

nsLIProfileName

X

 

 

由 Sun Java System Messaging Server 的漫游功能使用。

nsRoleDN

X

 

 

提高基于角色的操作的性能。

nswcalCALID

X

 

 

由 Sun Java System Calendar Server 使用。

owner

X

 

 

改善 Sun Java System 服务器的性能。引用完整性插件也使用该索引。有关详细信息,请参阅“维护引用的完整性”

pipstatus

X

 

 

由 Sun Java System 服务器使用。

pipuid

 

X

 

由 Sun Java System 服务器使用。

seeAlso

X

 

 

改善 Sun Java System 服务器的性能。引用完整性插件也使用该索引。有关详细信息,请参阅“维护引用的完整性”

sn

X

X

X

改善最常用的用户目录搜索类型的性能。

telephoneNumber

X

X

X

改善最常用的用户目录搜索类型的性能。

uid

X

 

 

改善 Sun Java System 服务器的性能。

uniquemember

X

 

 

改善 Sun Java System 服务器的性能。引用完整性插件也使用该索引。有关详细信息,请参阅“维护引用的完整性”

属性名称快速参考表

下表列出了具有主名称(真实名称)和别名的所有属性。创建索引时,请务必使用主名称。

表 10-3 主属性名称及其别名

主属性名称

属性的别名

authorCn

documentAuthorCommonName

authorSn

documentAuthorSurname

c

countryName

cn

commonName

co

friendlyCountryName

dc

domainComponent

dn

distinguishedName

drink

favoriteDrink

facsimileTelephoneNumber

fax

l

localityName

labeledUri

labeledUrl

mail

rfc822mailbox

mobile

mobileTelephoneNumber

o

organizationName

ou

organizationalUnitName

pager

pagerTelephoneNumber

sn

surname

st

stateOrProvinceName

street

streetAddress

ttl

timeToLive

uid

userId


管理索引

本节说明如何利用 Directory Server Console 和命令行为特定的属性创建和删除存在、等同、近似、子字符串和国际索引。请参阅“管理浏览索引”以了解进行虚拟列表视图 (VLV) 操作所需的单独步骤。


因为索引对每个后缀都是特定的,所以需要记住在每个后缀配置中都创建新索引。

使用控制台创建新后缀时,可以选择复制现有后缀的索引配置。


创建新的索引之前,请权衡由使用索引产生的利与弊。敬请牢记:

使用控制台管理索引

如果计划在很多属性上修改或添加索引,则应首先将后缀设为只读,然后将其内容导出到 LDIF。这样通过从 LDIF 文件重新初始化后缀将加快后缀的重新索引。

  1. 在 Directory Server Console 的顶级“配置”选项卡上,展开“数据”节点,并选择要索引的后缀。然后在右侧面板中,选择“索引”选项卡。
  2. 不能修改“系统索引”表。在“附加索引”表中,添加、修改或删除属性的索引。

  3. 要在一个仍未索引的属性上添加索引,请单击“添加属性”按钮。在显示的对话框中,选择一个或多个属性编制索引,并单击“确定”。
  4. 新属性显示在“附加索引”表中。

  5. 要修改属性的索引,请选中或取消选中想在“附加索引”表中为该属性维护的每种索引类型的复选框。
  6. 如果想要创建一个包含非英语值的属性的索引,请在“匹配规则”字段中输入想要使用的排序顺序的 OID。
  7. 通过列举多个 OID(中间用逗号,而不是空格分开),您可以使用多种语言来为属性编制索引。有关受支持的语言环境及其相关排序顺序的 OID 列表,请参阅《Directory Server Administration Reference》Chapter 5 "Directory Internationalization Reference"

  8. 要删除一个属性的所有索引,请在表中选择它所在的行并单击“删除属性”按钮。
  9. 单击“保存”,保存新索引配置。
  10. 如果删除了一个属性的所有索引,服务器将删除该属性的索引文件并结束配置。如果修改了属性的索引或添加了一个新索引,请继续执行以下步骤。

  11. 警告对话框通知您必须更新数据库文件以开始使用新索引。您可重新索引后缀或重新初始化后缀。
    • 如果仅添加或修改了一个或两个索引,或后缀必须可用,则应重新索引后缀。单击“重新索引后缀”按钮,显示重新索引对话框。默认情况下,会选定您修改过或添加到索引配置中的属性。单击“确定”,开始重新编制这些属性的索引。重新为带有数百万条条目的目录编制许多属性的索引可能花费数小时的时间,但是重新索引期间后缀将始终保持联机。
    • 如果添加或修改多个属性的索引,且从此后缀导出了最近的 LDIF 文件,请单击“初始化后缀”按钮。在“初始化后缀”对话框中,输入或浏览到 LDIF 文件的路径和名称,然后单击“确定”。服务器将从 LDIF 文件重新初始化后缀,并根据新的配置创建所有索引。根据目录大小的具体情况,重新初始化后缀通常比重新编制两个或更多属性的索引要快,但是后缀在初始化过程中不可用。
    • 如果不重新初始化后缀或重新索引后缀,则所有数据仍将可用,但是将不会创建新的索引,也不会提高目录访问性能。

从命令行管理索引

从命令行创建或修改索引涉及两个步骤:

创建索引配置条目

要为还没有编制索引的属性创建索引,则必须在相应的数据库配置中为该属性创建新条目。

索引配置条目具有下列 DN:

cn=attributeName,cn=index,cn=databaseName,cn=ldbm database,
 cn=plugins,cn=config

其中的 databaseName 是与您希望创建索引的后缀相对应的数据库名称。例如,以下命令将为 sn (surname) 属性的值创建法语的存在、等同、子字符串和“音似”索引:

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: cn=sn,cn=index,cn=databaseName,cn=ldbm database,
 cn=plugins,cn=config
objectClass: top
objectClass: nsIndex
cn: sn
nsSystemIndex: false
nsIndexType: pres
nsIndexType: eq
nsIndexType: sub
nsIndexType: approx
nsMatchingRule: 1.3.6.1.4.1.42.2.27.9.4.76.1
^D

索引配置条目具有 nsIndex 对象类,且必须具有 nsSystemIndex 属性,其值必须为 false。无法创建新系统索引。将只维护 Directory Server 内部定义的现有系统索引。

nsIndexType 属性的值列出了将为给定属性进行维护的索引。使用上面显示的任意值定义相应的索引。

也可以使用单值 none 显式地禁用属性的索引,例如为了临时禁用属性的索引。如果索引配置条目中不包括 nsIndexType 属性,则默认情况下将维护所有索引。

可选的 nsMatchingRule 属性包含用于国际化索引的语言排序顺序的 OID。有关受支持的语言环境及其相关排序顺序的 OID 的列表,请参阅《Directory Server Administration Reference》Chapter 5 "Directory Internationalization Reference"

有关索引配置属性的详细信息,请参阅《Directory Server Administration Reference》Chapter 2 中的"Default Index Attributes"


创建索引时应该使用属性的主名称,而不是它的别名。属性的主名称是架构中列出的属性的第一个名称,如 userid 属性的主名称为 uid。有关属性主名称和别名的完整列表,请参阅表 10-3


修改索引配置条目

要配置已经在属性上定义的索引,请修改相应的索引条目。例如,在先前定义的 sn 索引配置上执行以下命令将会删除“音似”索引,并将语言更改为加拿大法语:

ldapmodify -h host -p port -D "cn=Directory Manager" -w password
dn: cn=sn,cn=index,cn=databaseName,cn=ldbm database,
 cn=plugins,cn=config
changetype: modify
delete: nsIndexType
nsIndexType: approx
-
replace: nsMatchingRule
nsMatchingRule: 1.3.6.1.4.1.42.2.27.9.4.78.1
^D

运行 db2index-task

一旦创建了索引条目,将附加索引类型添加到现有的索引条目,或是修改了其排序顺序,请运行 directoryserver db2index-task 命令以生成新索引。该命令读取后缀的内容,并根据其配置条目重新编制给定属性的索引。

当此命令运行时,后缀的内容在服务器上保持可用,但是将不会对搜索编制索引,直到命令完成为止。重新索引是一项相当消耗资源的任务,它可能会影响服务器上其他操作的性能。根据目录大小的具体情况,重新初始化后缀通常比重新编制两个或更多属性的索引要快,但是该后缀在初始化过程中不可用。有关详细信息,请参阅“重新初始化后缀”

以下示例在与 databaseName 相对应的后缀中重新生成 sn 索引。

# /usr/sbin/directoryserver db2index-task
  -D "cn=Directory Manager" -w password -n databaseName -t sn

有关详细信息,请参阅《Directory Server Administration Reference》Chapter 1 中的 "db2index-task"

删除属性的所有索引

如果希望删除为属性配置的所有索引,可以删除其配置条目和数据库文件。例如,下列命令将为名为 databaseName 的数据库中的 sn 属性解除对所有索引的配置。

ldapdelete -h host -p port -D "cn=Directory Manager" -w password \
"cn=sn,cn=index,cn=databaseName,cn=ldbm database,cn=plugins, \
 cn=config"

一旦删除该条目,sn 属性的索引将不再与 databaseName 数据库对应的后缀中进行维护。也可以删除相应的索引文件以节约磁盘空间,因为服务器将不再使用它。在此示例中,您可以删除以下文件:

ServerRoot/slapd-serverID/db/databaseName/databaseName_sn.db3

重新索引后缀

如果索引文件被损坏,您将需要重新索引后缀以在相应的数据库目录中重新创建索引文件。有两种方法使用 Directory Server Console 重新索引后缀,即重新索引或重新初始化。

重新索引后缀

重新索引后缀时,服务器会检查它包含的所有条目,并重新生成索引文件。重新索引过程中,后缀的内容可以用于读取和写入操作。但是,服务器必须为重新编制了索引的每个属性扫描整个后缀。对于带有数百万个条目的后缀,这可能要花费多达数小时的时间,具体情况取决于您配置的索引。此外,在重新索引过程中,索引将不可用,服务器性能也将受影响。

要使用控制台重新编制后缀索引,请执行以下操作:

  1. 在 Directory Server Console 的顶级“配置”选项卡上,展开“数据”节点,显示要重新索引的后缀。
  2. 右键单击后缀配置节点,从弹出菜单中选择“重新索引”。或者,可以左键单击节点将其选中,然后从“对象”菜单中选择“重新索引”。
  3. 将显示“重新索引后缀”对话框,该对话框带有在选定后缀中编制索引的所有属性的列表。

  4. 选中要重新索引的每个属性旁的复选框。使用“全部选中”和“全部不选”按钮,帮助您作出选择。因为给定属性的所有索引都存储在同一个数据库文件中,所以必须一起重新编制所有这些索引。
  5. 单击“确定”。控制台将显示确认消息,提醒您可能返回意外的搜索结果,且重新索引过程中性能会受影响。
  6. 单击“是”,开始重新索引。
  7. 控制台显示有关重新索引的所有信息的对话框。完成后关闭该对话框。

要从命令行重新索引后缀,请遵循“运行 db2index-task”中的说明,并指定要重新生成索引文件的所有属性。

重新初始化后缀

重新初始化后缀时,替换其内容,并创建新的索引文件作为新内容导入。重新初始化后缀通常比重新编制一个以上属性的索引要快,因为加载条目时,所有属性都在一个通道中进行索引。但是,重新初始化后缀时后缀不可用。

可以使用 Directory Server Console 或从命令行执行以下所有步骤:

  1. “设置访问权限和引用”中所述,将后缀设为只读。首先必须使后缀变为不可写入,以便在导出内容后不会进行任何修改。
  2. “使用控制台将单一后缀导出到 LDIF”中所述,将整个后缀导出到 LDIF 文件。
  3. “初始化后缀”中所述,将同一 LDIF 文件导入以重新初始化后缀。
  4. 初始化期间,后缀将不可用。当初始化完成后,所有已配置的索引可供使用。

  5. “设置访问权限和引用”中所述,使后缀再次变为可写。

修改默认索引集

创建新后缀时使用的默认索引集在以下条目中定义:

cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config

无论何时使用控制台或从命令行创建后缀,默认索引定义条目将按原样复制以成为相应数据库的最初索引配置。

默认索引集只能使用命令行公用程序进行配置。默认索引条目具有与“从命令行管理索引”中描述的索引配置条目完全相同的语法。例如,使用以下 ldapmodify 命令添加默认索引配置条目:

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: cn=drink,cn=default indexes,cn=config,cn=ldbm database,
 cn=plugins,cn=config
objectClass: top
objectClass: nsIndex
cn: drink
nsSystemIndex: false
nsIndexType: eq
nsIndexType: sub
nsMatchingRule: 1.3.6.1.4.1.42.2.27.9.4.76.1
^D

添加此条目后,所有新的后缀将具有 drink 属性的值,该属性已编制了法语的等式和子字符串搜索的索引。

要修改或删除默认索引条目,请使用 ldapmodifyldapdelete 命令编辑 cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config 中的索引集。


管理浏览索引

浏览索引是仅用于要求服务器端排序或虚拟列表视图 (VLV) 结果的搜索操作的特殊索引。使用浏览索引可提高需要对大量结果进行服务器端排序的搜索的性能。根据目录配置,服务器可拒绝在没有定义浏览索引的情况下执行要求排序的搜索。这样可防止大量排序操作使服务器资源超过负载。

浏览索引适用于作为搜索基准的条目,且必须为在已排序的请求中使用的每个搜索过滤器创建单独的索引。例如,如果客户机应用程序经常请求所有用户的已排序列表,则应为客户机使用的过滤器字符串创建 ou=People 的浏览索引。

与其他索引一样,在维护浏览索引所需的更新操作期间将损失性能。应仔细计划和测试浏览索引的部署。

用于控制台的浏览索引

Directory Server Console 经常执行整个目录的搜索以刷新其面板的内容。如果已配置控制台为目录树中的条目排序,如“目录树视图选项”中所述,则应为控制台创建浏览索引。

用于控制台的浏览索引专用于由控制台执行的搜索。它们也是使用控制台创建的。要为控制台创建浏览索引,请执行以下操作:

  1. 在 Directory Server Console 的顶级“目录”选项卡上,浏览目录树以显示需要排序的大型子树的父级,例如包含数千个用户条目的 ou=People,dc=example,dc=com
  2. 右键单击父条目并从弹出菜单中选择“创建浏览索引”。或者,左键单击条目以选定,并从“对象”菜单中选择“创建浏览索引”。
  3. “创建浏览索引”对话框显示索引创建的状态。控制台创建如下所示的浏览索引配置条目,然后生成索引文件的内容。

  4. 单击“关闭”按钮,关闭“创建浏览索引”对话框。
  5. 任何控制台刷新操作将使新索引立即生效,且将维护添加到目录中的任何新数据。不需要重新启动服务器。

用于控制台的浏览索引配置由以下条目组成。vlvSearch 条目定义将被编制索引的搜索的基准、范围和过滤器。vlvIndex 条目的 vlvSort 属性按照属性排序的顺序显示支持排序 的属性:

dn: cn=MCC entryDN,cn=databaseName,cn=ldbm database,
 cn=plugins,cn=config
objectClass: top
objectClass: vlvSearch
cn: MCC entryDN
vlvBase: "entryDN"
vlvScope: 1
vlvFilter: (|(objectclass=*)(objectclass=ldapsubentry))

dn: cn=by MCC entryDN, cn=MCC entryDN,cn=databaseName,
 cn=ldbm database,cn=plugins,cn=config
objectClass: top
objectClass: vlvIndex
cn: by MCC entryDN
vlvSort: cn givenname o ou sn uid

要删除 Directory Server Console 的浏览索引,请执行以下操作:

  1. 在 Directory Server Console 的顶级“目录”选项卡上,浏览目录树,显示已在其中创建浏览索引的条目。
  2. 右键单击条目并从弹出菜单中选择“删除浏览索引”。或者,左键单击条目以选定,并从“对象”菜单中选择“删除浏览索引”。此菜单项仅当所选条目具有用于控制台的浏览索引时才可用。
  3. 这时将出现一个“删除浏览索引”对话框,要求您确认对索引的删除操作。单击“是”,删除浏览索引。

用于客户机搜索的浏览索引

必须手动定义为排序客户机搜索结果而定制的浏览索引。从命令行创建浏览索引或者虚拟列表视图 (VLV) 索引涉及两个步骤:

指定浏览索引条目

浏览索引是特定于给定基准条目及其子树上的给定的搜索。浏览索引配置是在包含条目的后缀的数据库配置中定义的。


不能在已链接的后缀中创建浏览索引,只能在本地后缀和子后缀中创建。


两个条目用于配置浏览索引。第一个使用 vlvSearch 对象类并指定其结果将被编制索引的搜索操作的基准、范围和过滤器。第二个条目是第一个条目的子级,并使用 vlvIndex 对象类来指定要排序的属性以及采用何种顺序进行排序。

以下示例使用 ldapmodify 公用程序创建两个浏览索引配置条目:

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: cn=Browsing ou=People, cn=databaseName,
 cn=ldbm database,cn=plugins,cn=config
objectClass: top
objectClass: vlvSearch
cn: Browsing ou=People
vlvbase: ou=People,dc=example,dc=com
vlvscope: 1
vlvfilter: (objectclass=inetOrgPerson)

dn: cn=Sort rev employeenumber, cn=Browsing ou=People,
 cn=databaseName,cn=ldbm database,cn=plugins,cn=config
objectClass: top
objectClass: vlvIndex
cn: Sort rev employeenumber
vlvSort: -employeenumber
^D

vlvscope 可为 0 代表基准条目本身,或为 1 代表基准条目的直接子条目,或为 2 代表以基准条目为根的整个子树。vlvfilter 是将用于客户机搜索操作的同一 LDAP 过滤器。因为所有的浏览索引条目都位于同一位置,所以应使用描述性的 cn 值命名浏览索引。

每个 vlvSearch 条目必须至少具有一个 vlvIndex 条目。vlvSort 属性是定义要排序的属性和排序顺序的属性名称的列表。属性名称前面的短横线 (-) 表示反排序。可通过定义多个 vlvIndex 条目为搜索定义多个索引。在前面的示例中,可添加以下条目:

ldapmodify -a -h host -p port -D "cn=Directory Manager" -w password
dn: cn=Sort sn givenname uid, cn=Browsing ou=People,
 cn=databaseName,cn=ldbm database,cn=plugins,cn=config
objectClass: top
objectClass: vlvIndex
cn: Sort sn givenname uid
vlvSort: sn givenname uid
^D

要修改浏览索引配置,请编辑相应的 vlvSearchvlvIndex 条目。要删除浏览索引以使其不再由服务器维护,请删除单个 vlvIndex 条目,或者如果只有一个浏览索引,则请删除 vlvSearch 条目和 vlvIndex 条目。当删除 vlvIndex 条目时,可能也删除相应的数据库文件,例如:

ServerRoot/slapd-serverID/db/dbName/dbName_vlv#Sortsngivennameuid.db3

运行 vlvindex 命令

一旦创建了浏览索引条目或修改了现有的浏览索引条目,则必须运行 directoryserver vlvindex 命令以生成新的浏览索引集。此命令将扫描目录内容并为浏览索引创建数据库文件。

要生成浏览索引,请使用以下命令:

 

# /usr/sbin/directoryserver vlvindex

以下示例生成前面小节中定义的浏览索引:

# /usr/sbin/directoryserver vlvindex -n databaseName -T "Browsing ou=People"

表 10-4 示例中使用的 vlvindex 选项的说明

选项

说明

-n

指定包含需要编制索引的条目的数据库名称。

-T

指定相应浏览索引的 vlvSearch 条目的命名属性值。将生成所有与给定的 vlvSearch 条目的 vlvIndex 条目相对应的索引。

有关详细信息,请参阅《Directory Server Administration Reference》Chapter 1 中的 "vlvindex"



上一章      目录      索引      下一章     


版权所有 2004 Sun Microsystems, Inc. 保留所有权利。