【问题标题】:How to optimize a search over ldap?如何优化对 ldap 的搜索?
【发布时间】:2014-12-16 15:31:49
【问题描述】:

我的组织的 ldap 中有一个使用 openldap 实现的只读用户,我不知道树的确切结构,但我知道对象 bogota、medellin、palmira 下有许多组织单元,(依次位于组织xxx.edu.co 的下方)。我有兴趣在二级组织(波哥大、麦德林、帕尔米拉)下面的每个people 组织单元中使用另一个名为employeeNumber 的属性搜索uid 的人。我可以通过以下方式实现:

ldapsearch -h secret.xxx.edu.co -D 'uid=myUser,ou=Institucional,o=bogota,o=xxx.edu.co' -w myPass -x -b 'ou=People,o=bogota,o=xxx.edu.co' '(&(employeeNumber=123485))'

问题在于效率,考虑到我的组织有超过 40000 个用户,搜索速度非常慢,如果我使用 uid 搜索,搜索速度非常快,我猜这棵树完全是由'uid' 或类似的东西。关键是,正是 uid 是我的目标,另外我知道我搜索的人的 uid 的近似形式,例如,我知道如果我正在搜索具有 employeeNumber=12345 的 Pepito Pérez 的 uid,这必须以“p”开头。

我怎样才能在这个问题上取得更好的表现?

我认为通过索引 uid 属性中的正则表达式过滤树并在此子集中搜索employeeNumber 之后可能具有良好的性能。我需要一种不需要 ldap 管理员权限的方法。

【问题讨论】:

    标签: algorithm ldap openldap ldap-query


    【解决方案1】:

    听起来您需要将equality 索引添加到employeeNumber 属性。这将使您的上述搜索与 uid 搜索一样执行。

    如果您想有效地进行部分uid 匹配,您将需要uid 属性上的substring 索引。

    除此之外,您的过滤器(&(employeeNumber=123485)) 可以简单地表示为(employeeNumber=123485)。不需要and (&),因为只有一个子句。

    如果您有适当的索引,您可以使用这样的过滤器执行搜索...

    (&(employeeNumber=123485)(uid=p*))

    这会让你得到你想要的。

    【讨论】:

    • 如果我没有只有读取权限的用户,那么添加到employeeNumber 的平等索引是解决我问题的理想方案。
    • 那么,您根本无法控制索引的内容吗?既然是这种情况,并且您只有 40,000 个条目,我将获取所有条目的键并创建一个仅映射键的本地数据库。我会只保留employeeNumber 和目录的唯一ID;这些不太可能改变。通过定期查找新创建的条目来保持最新状态。当您需要按员工编号搜索用户时,请进行本地翻译并按唯一 ID 搜索。如果未找到,则按employeeNumber 对用户进行后续搜索,但使用自上次同步以来的createtime 进行控制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2016-12-05
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多