我不是 LDAP 专家,我所做的只是在
users
上运行一些过滤器,例如获取以某个前缀开头的用户名。每次我在 *
中使用 filter
时都会收到错误:
[LDAP: error code 53 - Unwilling to process the unindexed search operation]; remaining name 'ou=internal,o=XXX,c=us'
此后就没有发出任何消息,甚至不确定该错误消息是什么意思。
传入
filter
用户名的精确匹配效果很好:
String filter = "uid=exactMatchuserName";
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
constraints.setReturningAttributes(attrIdsToSearch);
NamingEnumeration users = ldapConnection().search(
"ou=internal,o=XXX,c=us",
filter,
constraints
);
但是当我在搜索中使用
*
时String filter = "uid=*ma";
然后我收到错误
服务器告诉您它不愿意执行无法使用索引的搜索。如果你不知道什么是索引,你可以阅读维基百科关于数据库索引的文章,但简而言之:
索引用于快速定位数据,而无需每次访问数据库表时都搜索数据库表中的每一行。
索引是通过按照索引中指定的方式对其中一列进行排序而构建的(对于字符串列,通常按字母顺序排列)。因此,例如,如果我搜索
uid=gabriel
,则不需要查看目录中的每个用户。它可以直接跳到 G 并快速找到它。
但是,这意味着只有当您至少知道第一个字母时才能使用索引。当您在搜索开头使用通配符时,您不知道第一个字母,因此无法使用索引,并且需要检查目录中的每个用户是否匹配。
您有 3 个选择:
uid
中使用通配符。您只需要至少一个索引标准。uid
属性。因此,在线搜索您正在使用的目录服务器,看看是否可以启用。请记住,禁用未索引的搜索是默认设置是有原因的。