6.5. 使用虚拟列表视图控制请求大型搜索结果的连续子集
目录服务器支持 LDAP 虚拟列表视图控制。此控制可让 LDAP 客户端请求大型搜索结果的连续子集。
例如,您已在目录服务器中存储了一个包含 100.000 条目的地址书。默认情况下,查询所有条目一次返回所有条目。这是一个资源和耗时的操作,客户端通常不需要整个数据集,因为如果用户滚动了结果,则只会看到部分集合。
但是,如果客户端使用 VLV 控制,服务器仅返回子集,例如,如果用户在客户端应用程序中滚动,服务器会返回更多条目。这可减少服务器上的负载,并且客户端不需要一次性存储和处理所有数据。
当所有搜索参数都被修复时,VLV 还提高了服务器使用搜索的性能。目录服务器在 VLV 索引中预计算搜索结果。因此,VLV 索引比检索结果更高效,并在之后对其进行排序。
在目录服务器中,VLV 控制始终可用。但是,如果您在大型目录中使用它,则称为浏览索引的 VLV 索引可能会显著提高速度。
目录服务器不会维护属性的 VLV 索引,如用于标准索引。服务器根据条目中设置的属性以及目录树中这些条目的位置动态生成 VLV 索引。与标准条目不同,VLV 条目是数据库中的特殊条目。
6.5.1. VLV 控制在 ldapsearch 命令中的工作方式 复制链接链接已复制到粘贴板!
通常,您可以在 LDAP 客户端应用程序中使用虚拟列表视图(VLV)功能。但是,例如用于测试目的,您可以使用 ldapsearch 工具只请求部分结果。
要在 ldapsearch 命令中使用 VLV 功能,请为 sss (服务器侧排序)和 vlv 搜索扩展指定 -E 选项:
ldapsearch ... -E 'sss=attribute_list' -E 'vlv=query_options'
# ldapsearch ... -E 'sss=attribute_list' -E 'vlv=query_options'
sss 搜索扩展具有以下语法:
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
vlv 搜索扩展使用以下语法:
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
-
before设置在目标之前返回的条目数。 -
after设置目标后返回的条目数。 -
索引、计数和值有助于确定目标条目。如果您设置了值,则目标条目是第一个带有第一个排序属性从值开头的属性。否则,您可以将count设置为0,目标条目由索引值决定(从 1 开始)。如果count值大于0,则目标条目由比率索引决定。
例 6.2. 带有 VLV 搜索扩展的 ldapsearch 命令的输出
以下命令在 ou=People,dc=example,dc=com 中搜索。然后,服务器会根据 cn 属性对结果进行排序,并在偏移后返回 70 条目的 uid 属性以及一个条目。
6.5.2. 启用未经身份验证的用户使用 VLV 控制 复制链接链接已复制到粘贴板!
默认情况下,oid=2.16.840.1.113730.3.4.9,cn=features,cn=config 条目中的访问控制指令(ACI)仅允许经过身份验证的用户使用 VLV 控制。要启用非验证的用户使用 VLV 控制,请通过将 userdn = "ldap:///all" 改为 userdn = "ldap:///anyone"来更新 ACI
流程
更新
oid=2.16.840.1.113730.3.4.9,cn=features,cn=config中的 ACI:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 VLV 控制执行查询没有指定绑定用户:
ldapsearch -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
# ldapsearch -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uidCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令要求服务器允许匿名绑定。
如果命令成功,但没有返回条目,请使用绑定用户再次运行查询,以确保查询在使用身份验证时正常工作。
6.5.3. 使用命令行创建 VLV 索引,以提高 VLV 查询的速度 复制链接链接已复制到粘贴板!
按照以下步骤,为包含 mail 属性的 ou=People,dc=example,dc=com (包含 mail 属性)的 ou=People,dc=example,dc=com 创建一个虚拟列表视图(VLV)索引,该索引设置为 person。
先决条件
- 您的客户端应用程序使用 VLV 控制。
- 客户端应用程序需要查询大型搜索结果的连续子集。
- 目录包含大量条目。
流程
创建 VLV 搜索条目:
dsconf <instance_name> backend vlv-index add-search --name "VLV People" --search-base "ou=People,dc=example,dc=com" --search-filter "(&(objectClass=person)(mail=*))" --search-scope 2 userRoot
# dsconf <instance_name> backend vlv-index add-search --name "VLV People" --search-base "ou=People,dc=example,dc=com" --search-filter "(&(objectClass=person)(mail=*))" --search-scope 2 userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令使用以下选项:
-
--name设置搜索条目的名称。这可以是任意名称。 -
--search-base为 VLV 索引设置基本 DN。目录服务器在此条目上创建 VLV 索引。 -
--search-scope设置搜索范围,以针对 VLV 索引中的条目运行。您可以将这个选项设置为0 (基本搜索)、1 (一级搜索)或2 (subtree 搜索)。 -
--search-filter在创建 VLV 索引时,会应用过滤器目录服务器。只有匹配此过滤器的条目才会成为索引的一部分。 -
userroot是在其中创建条目的数据库的名称。
-
创建索引条目:
dsconf <instance_name> backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it userRoot
# dsconf <instance_name> backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令使用以下选项:
-
--index-name设置索引条目的名称。这可以是任意名称。 -
--parent-name设置 VLV 搜索条目的名称,必须与您在上一步中设置的名称匹配。 -
--sort设置属性名称及其排序顺序。按空格分开属性。 -
--index-it会导致目录服务器在创建条目后自动启动索引任务。 -
userroot是在其中创建条目的数据库的名称。
-
验证
在
/var/log/dirsrv/slapd- <instance_name> /errors文件中验证 VLV 索引是否成功创建:[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
ldapsearch命令中的 VLV 控制来仅查询目录中的特定记录:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假设您已将名为
uid=user001的条目持续命名为ou=People,dc=example,dc=com中的uid=user072。
6.5.4. 使用 Web 控制台创建 VLV 索引来提高 VLV 查询的速度 复制链接链接已复制到粘贴板!
按照以下步骤,为包含 mail 属性的 ou=People,dc=example,dc=com (包含 mail 属性)的 ou=People,dc=example,dc=com 创建一个虚拟列表视图(VLV)索引,该索引设置为 person。
先决条件
- 在 web 控制台中登录到实例。
- 您的客户端应用程序使用 VLV 控制。
- 客户端应用程序需要查询大型搜索结果的连续子集。
- 目录包含大量条目。
流程
-
导航到
。 点 ,并填写字段:
-
VLV Index Name:搜索条目的名称。这可以是任意名称。 -
搜索基础:用于 VLV 索引的基本 DN。目录服务器在此条目上创建 VLV 索引。 -
Search Filter: 创建 VLV 索引时应用过滤器目录服务器。只有匹配此过滤器的条目才会成为索引的一部分。 -
搜索范围:搜索范围,运行 VLV 索引中的条目。
-
- 单击 。
- 点
输入属性名称,然后选择 Reindex After Saving。
- 单击 。
验证
进入
,验证是否成功创建 VLV 索引: [26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
ldapsearch命令中的 VLV 控制来仅查询目录中的特定记录:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例假设您已将名为
uid=user001的条目持续命名为ou=People,dc=example,dc=com中的uid=user072。