我尝试使用Springs LdapQuery运行搜索,但行为并不完全符合我的预期。我的直觉是我提供的过滤器越多,工作数据集就越小。相反,似乎过滤器彼此独立地行动,然后那些各种工作集在返回之前一起被挤出,经常导致以下错误" [LDAP:错误代码11-超出管理限制]"
以下是我的搜索的清理版本:
public List<OurUser> search(String nameSearchString, String city) {
ldapTemplate.setDefaultCountLimit(100);//return up to 100 users
LdapQuery query = query()
.searchScope(SearchScope.ONELEVEL)
.base("ou=People")
.where("objectclass").is("inetOrgPerson")
.and(query().
where("userStatus").is("Active")
.and("userEmployer").is("OurCompany")
.and("ou").is(city)
)
.and(query().where("cn").like(nameSearchString + "*")
.or("sn").like(nameSearchString + "*")
.or("givenName").like(nameSearchString + "*")
.or("primaryEmail").like(nameSearchString + "*")
.or("someUID").like(nameSearchString + "*")
.or("employeeId").like(nameSearchString + "*")
.or("someOtherUID").like(nameSearchString + "*")
);
List<OurUser> users = ldapTemplate.search(query, ourUserContextMapper);
return users;
}
让我们假设城市搜索标准总是被填充(如何&#34;洛杉矶&#34;)。 namesSearchString可以变化,因为它是用户真正搜索的值。当我们有几个字符(&#34; STEW&#34;)时,它按预期运行,但只有一两个我们看到上面提到的错误(&#34; S&#34;)。这个错误在某种程度上是有道理的,因为找一个有&#34; S&#34;在任何这些领域中都将检索整个组织中的大量匹配....但在我的脑海中添加了其他查询参数,添加了&#34; city&#34;在将名称/ sn / etc查询应用到之前,限制会自动将该列表缩小到远低于100人。
这让我觉得我在这里遗漏了一些东西,或者我在尝试将sql谓词处理与ldap进行比较时犯了一个错误。
所以,我的问题的根源是: 1)我对谓词组合的方式缺少什么? 2)如何(如果可能的话)我可以强制查询首先按城市限制,然后应用辅助&#34;名称&#34;过滤条件?
谢谢!
答案 0 :(得分:0)
这里的关键是错误信息。请注意,它没有声明“超出大小限制”,而是“超出管理限制”,这完全意味着其他内容。 “超出管理限制”通常是指一个名为“透视限制”的设置,如果您考虑它,则在这种情况下有意义。
问题需要在LDAP服务器上解决,或者通过更改外观限制,或者通过强制缩小搜索空间,就像你在第二个问题中暗示的那样。我最好的办法是确保将最重要的搜索字段(在这种情况下为userEmployer
和/或ou
)编入索引。这应该强制服务器首先应用这些过滤器,从而充分限制系统需要查看的项目数。