13.4. 使用虚拟列表视图控制请求大型搜索结果的连续子集
目录服务器支持 LDAP 虚拟列表视图控制。此控制可让 LDAP 客户端请求大型搜索结果的连续子集。
例如,您已在目录服务器中存储了一个包含 100.000 条目的地址书。默认情况下,查询所有条目一次返回所有条目。这是一个资源和耗时的操作,客户端通常不需要整个数据集,因为如果用户滚动了结果,则只会看到部分集合。
但是,如果客户端使用 VLV 控制,服务器仅返回子集,例如,如果用户在客户端应用程序中滚动,服务器会返回更多条目。这可减少服务器上的负载,并且客户端不需要一次性存储和处理所有数据。
当所有搜索参数都被修复时,VLV 还提高了服务器使用搜索的性能。目录服务器在 VLV 索引中预计算搜索结果。因此,VLV 索引比检索结果更高效,并在之后对其进行排序。
在目录服务器中,VLV 控制始终可用。但是,如果您在大型目录中使用它,则称为浏览索引的 VLV 索引可能会显著提高速度。
目录服务器不会维护属性的 VLV 索引,如用于标准索引。服务器根据条目中设置的属性以及目录树中这些条目的位置动态生成 VLV 索引。与标准条目不同,VLV 条目是数据库中的特殊条目。
13.4.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 设置目标后返回的条目数。
- 索引、计数 和 值 有助于确定目标条目。如果设置 value,则目标条目是第一个带有第一个排序属性从值开头的属性。否则,您可以将 count 设置为 0, 目标条目由 索引 值决定(从 1 开始)。如果 count 值大于 0, 则目标条目由 比率索引 决定。
例 13.1. 带有 VLV 搜索扩展的 ldapsearch 命令的输出
以下命令在 ou=People,dc=example,dc=com 中搜索。然后,服务器会根据
cn
属性对结果进行排序,并在偏移后返回 70 条目的 uid
属性以及一个条目。
详情请查看 ldapsearch(1) man page 中的
-E
参数描述。
13.4.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' uid
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令要求服务器允许匿名绑定。如果命令成功,但没有返回条目,请使用绑定用户再次运行查询,以确保查询在使用身份验证时正常工作。
13.4.3. 使用命令行创建 VLV 索引,以提高 VLV 查询的速度 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
按照以下步骤,创建一个虚拟列表视图 (VLV) 索引,也称为浏览索引。它用于包括了一个
mail
属性,且 objectClass
属性被设置为 person 的 ou=People,dc=example,dc=com 中的条目。
先决条件
- 您的客户端应用程序使用 VLV 控制。
- 客户端应用程序需要查询大型搜索结果的连续子集。
- 目录包含大量条目。
流程
- 创建 VLV 搜索条目:
dsconf -D "cn=Directory Manager" ldap://server.example.com 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 -D "cn=Directory Manager" ldap://server.example.com 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
Copy 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 -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it dc=example,dc=com
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it dc=example,dc=com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令使用以下选项:--index-name
设置索引条目的名称。这可以是任意名称。--parent-name
设置 VLV 搜索条目的名称,必须与您在上一步中设置的名称匹配。--sort
设置属性名称及其排序顺序。按空格分开属性。--index-it
会导致目录服务器在创建条目后自动启动索引任务。dc=example,dc=com
是数据库后缀,在其中创建该条目。
验证
- 在
/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
。
详情请查看 ldapsearch(1) man page 中的
-E
参数描述。
13.4.4. 使用 Web 控制台创建 VLV 索引来提高 VLV 查询的速度 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
按照以下步骤,创建一个虚拟列表视图 (VLV) 索引,也称为浏览索引。它用于包括了一个
mail
属性,且 objectClass
属性被设置为 person 的 ou=People,dc=example,dc=com 中的条目。
先决条件
- 您的客户端应用程序使用 VLV 控制。
- 客户端应用程序需要查询大型搜索结果的连续子集。
- 目录包含大量条目。
流程
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录目录服务器”。
- 进入
- 点并填写字段:
图 13.1. 使用 Web 控制台创建 VLV 索引
- 输入属性名称,然后单击。
- 选择 Index VLV on Save。
- 单击。
验证
- 进入
[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
。
详情请查看 ldapsearch(1) man page 中的
-E
参数描述。