【发布时间】:2014-10-07 01:38:47
【问题描述】:
当前问题与this one不一样。
我有一个 LDAP 条目,其中“supName”字段中的内容是“这确实是一个 SimpleTest”。
我需要编写一个过滤器,以便当我的软件用户在任何情况下(大写、小写或混合大小写)引入此内容的任何子字符串时,它都能找到条目。即使用户没有输入完整的单词(例如“impletes”),它也必须工作。
supName 字段遵循 DirectoryString 语法。这意味着默认匹配规则是精确且区分大小写的(“caseExactMatch”)。但是这个语法in theory,也应该允许“caseIgnoreMatch”和“caseIgnoreSubstringsMatch”匹配规则。我虽然只需要强制使用最后一个(“caseIgnoreSubstringsMatch”),所以我尝试了这个过滤器:
(supName:caseIgnoreSubstringsMatch:=*impletes*)
但这不起作用。我使用 Apache Directory Studio 进行测试,但该工具拒绝接受上述过滤器。它抱怨星号,我不明白为什么,因为我使用的是子字符串匹配(因此应该允许星号)。如果我从命令行运行过滤器(使用 ldapsearch),我会收到以下错误消息:
ldap_search_ext: Bad search filter (-7)
因此,这不是 Apache Directory Studio 的问题。
所以我的问题是:在默认情况下区分大小写的字段上定义不区分大小写的子字符串过滤器的正确方法是什么?
进一步测试:
以下是我测试过的其他一些过滤器,以及它们不适合我的原因。
测试 #1 过滤器:
(supName=*impleTes*)
此运算符 (=) 返回我的测试条目,但它不区分大小写。如果我将“impleTes”替换为“impletes”,它不会返回任何内容。
测试 #2 过滤器:
(supName~=simpletest)
此运算符 (~=) 有效,但是:
- 它需要一个完整的单词。如果我将“simpletest”替换为“impletes”,它不会返回任何内容。
- 由于它是一个“近似”搜索运算符,它可能会返回不需要的结果。例如,上面的过滤器还返回第二个条目:“这确实是一个 SimpleTast”(注意“SimpleTast”中的“a”而不是“e”)。我不想要大概的结果。
测试#3 过滤器:
(supName:caseIgnoreMatch:=this is a simpletest indeed)
这将返回我期望的条目,并且只返回那个条目。它也是不区分大小写的。但它强制用户编写字段的全部内容:它不是子字符串搜索,而是不区分大小写的完全匹配搜索。
测试 #4 过滤器:
(supName:caseIgnoreMatch:=*impletes*)
这会返回“错误的搜索过滤器 (-7)”错误,这是预期的,因为我不允许在精确匹配规则中使用子字符串语法。
最后是测试#5 过滤器:
(supName:caseIgnoreSubstringsMatch:=*impletes*)
我希望它可以工作,但返回“错误搜索过滤器 (-7)”错误。
附加信息 - 反例
我找到了相反情况的here(参见末尾的“可扩展匹配”部分)示例。在示例中,字段“sn”默认使用“caseIgnoreMatch”匹配规则(使其不区分大小写)。因此,他们在示例中想要进行区分大小写的子字符串搜索。这是他们使用的过滤器:
(sn:caseExactSubstringMatch:=*S*)
但我怀疑这个例子是否正确,因为如果我在我这边尝试完全相同的过滤器:
(supName:caseExactSubstringMatch:=*S*)
我收到“错误的搜索过滤器 (-7)”错误。
所以也许我的问题是由于 OpenLDAP 2.4.33 的限制,但可以与其他 LDAP 服务器一起使用,尽管该示例来自应该涵盖 OpenLDAP 2.x 的指南......(?)
【问题讨论】:
标签: filter ldap substring openldap case-insensitive