搜索

13.4. 使用虚拟列表视图控制来请求大型搜索结果的连续子集

download PDF
目录服务器支持 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'
sss 搜索扩展使用以下语法:
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
vlv 搜索扩展使用以下语法:
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
  • before 设置在目标前返回的条目数。
  • 设置目标后返回的条目数。
  • 索引计数 和值 有助于确定目标条目。如果设置 value,则目标条目是第一个带有第一个排序属性从值开头的属性。否则,您将 count 设置为 0, 目标条目由 索引 值决定(从 1 开始)。如果 计数 值大于 0, 则目标条目由 条目/计数的比例索引站号 决定。

例 13.1. 带有 VLV 搜索扩展的 ldapsearch 命令的输出

以下命令在 ou=People,dc=example,dc=com 中搜索。然后,服务器会根据 cn 属性对结果进行排序,并返回 70 条目的 uid 属性,并在偏移前一个条目和两个条目。
# ldapsearch -D "cn=Directory Manager" -W -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
# user069, People, example.com
dn: uid=user069,ou=People,dc=example,dc=com
uid: user069

# user070, People, example.com
dn: uid=user070,ou=People,dc=example,dc=com
uid: user070

# user071, People, example.com
dn: uid=user071,ou=People,dc=example,dc=com
uid: user071

# user072, People, example.com
dn: uid=user072,ou=People,dc=example,dc=com
uid: user072

# search result
search: 2
result: 0 Success
control: 1.2.840.113556.1.4.474 false MIQAAAADCgEA
sortResult: (0) Success
control: 2.16.840.1.113730.3.4.10 false MIQAAAALAgFGAgMAnaQKAQA=
vlvResult: pos=70 count=40356 context= (0) Success

# numResponses: 5
# numEntries: 4
Press [before/after(/offset/count|:value)] Enter for the next window.
详情请查看 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 "。

流程

  • 更新 oid=2.16.840.1.113730.3.4.9,cn=features,cn=config 中的 ACI:
    # ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    
    dn: oid=2.16.840.1.113730.3.4.9,cn=features,cn=config
    changetype: modify
    replace: aci
    aci: (targetattr != "aci")(version 3.0; acl "VLV Request Control"; allow( read, search, compare, proxy ) userdn = "ldap:///anyone";)

验证

  • 使用 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
    此命令要求服务器允许匿名绑定。
    如果命令成功,但没有返回条目,则使用绑定用户再次运行查询,以确保在使用身份验证时查询可以正常工作。

13.4.3. 使用命令行创建 VLV 索引,以提高 VLV 查询的速度

按照以下步骤,创建一个虚拟列表视图 (VLV) 索引,也称为浏览索引。它用于包括了一个 mail 属性,且 objectClass 属性被设置为 personou=People,dc=example,dc=com 中的条目。

先决条件

  • 您的客户端应用程序使用 VLV 控制。
  • 客户端应用程序需要查询大型搜索结果的连续子集。
  • 目录包含大量条目。

流程

  1. 创建 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
    这个命令使用以下选项:
    • --name 设置搜索条目的名称。这可以是任何名称。
    • --search-base 为 VLV 索引设置基本 DN。目录服务器在此条目上创建 VLV 索引。
    • --search-scope 设置为 VLV 索引中的条目运行的搜索范围。您可以将这个选项设置为 0 ( 基础搜索)、1 ( 单向搜索)或 2 ( 子树搜索)。
    • --search-filter 在创建 VLV 索引时设置过滤器目录服务器应用。只有与此过滤器匹配的条目成为索引的一部分。
    • userroot 是数据库的名称,在其中创建该条目。
  2. 创建索引条目:
    # 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
    这个命令使用以下选项:
    • --index-name 设置索引条目的名称。这可以是任何名称。
    • --parent-name 设置 VLV 搜索条目的名称,且必须与您在上一步中设置的名称匹配。
    • --sort 设置属性名称及其排序顺序。按空格分隔属性。
    • --index-it 会导致 Directory 服务器在创建条目后自动启动索引任务。
    • dc=example,dc=com 是数据库的后缀,用于创建该条目。

验证

  1. 验证 /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.
  2. ldapsearch 命令中使用 VLV 控制只查询目录中的特定记录:
    # ldapsearch -D "cn=Directory Manager" -W -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
    # user069, People, example.com
    dn: uid=user069,ou=People,dc=example,dc=com
    cn: user069
    
    # user070, People, example.com
    dn: uid=user070,ou=People,dc=example,dc=com
    cn: user070
    
    # user071, People, example.com
    dn: uid=user071,ou=People,dc=example,dc=com
    cn: user071
    
    # user072, People, example.com
    dn: uid=user072,ou=People,dc=example,dc=com
    cn: user072
    本例假设您在 ou=People,dc=example,dc=com 中至少将 uid=user001 命名为 uid=user072
详情请查看 ldapsearch(1) man page 中的 -E 参数描述。

13.4.4. 使用 Web 控制台创建 VLV 索引以提高 VLV 查询的速度

按照以下步骤,创建一个虚拟列表视图 (VLV) 索引,也称为浏览索引。它用于包括了一个 mail 属性,且 objectClass 属性被设置为 personou=People,dc=example,dc=com 中的条目。

先决条件

  • 您的客户端应用程序使用 VLV 控制。
  • 客户端应用程序需要查询大型搜索结果的连续子集。
  • 目录包含大量条目。

流程

  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 导航到 Database Suffixes dc=example,dc=com VLV Indexes
  3. Create VLV Index 并填写字段:

    图 13.1. 使用 Web 控制台创建 VLV 索引

    使用 Web 控制台创建 VLV 索引
  4. 输入属性名称,然后点 Add Sort Index
  5. 选择 Index VLV on Save
  6. Save VLV Index

验证

  1. 进入 Monitoring Logging Errors Log
    [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.
  2. ldapsearch 命令中使用 VLV 控制只查询目录中的特定记录:
    # ldapsearch -D "cn=Directory Manager" -W -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
    # user069, People, example.com
    dn: uid=user069,ou=People,dc=example,dc=com
    cn: user069
    
    # user070, People, example.com
    dn: uid=user070,ou=People,dc=example,dc=com
    cn: user070
    
    # user071, People, example.com
    dn: uid=user071,ou=People,dc=example,dc=com
    cn: user071
    
    # user072, People, example.com
    dn: uid=user072,ou=People,dc=example,dc=com
    cn: user072
    本例假设您在 ou=People,dc=example,dc=com 中至少将 uid=user001 命名为 uid=user072
详情请查看 ldapsearch(1) man page 中的 -E 参数描述。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.