使用openldap进行近似搜索
我正在尝试编写一个搜索,查询运行openldap的目录服务器 用户将使用他们感兴趣的人的名字或姓氏进行搜索 我发现重音字符有问题(比如使用openldap进行近似搜索,ldap,openldap,Ldap,Openldap,我正在尝试编写一个搜索,查询运行openldap的目录服务器 用户将使用他们感兴趣的人的名字或姓氏进行搜索 我发现重音字符有问题(比如áíóú),因为名字和姓氏都是用西班牙语写的,所以正确的方法是pérez,为了便于搜索,它可以写为Perez,而不带重音 如果我使用”(cn=*Perez*)”我只得到非重音的结果 如果我使用”(cn=*pérez*)”我只会得到强调的结果 如果我使用'(cn=~Perez)我会得到奇怪的结果(或者至少没有我可以使用的东西,因为虽然结果同时包含Perez和pér
áíóú
),因为名字和姓氏都是用西班牙语写的,所以正确的方法是pérez
,为了便于搜索,它可以写为Perez
,而不带重音
如果我使用”(cn=*Perez*)”
我只得到非重音的结果
如果我使用”(cn=*pérez*)”
我只会得到强调的结果
如果我使用'(cn=~Perez)
我会得到奇怪的结果(或者至少没有我可以使用的东西,因为虽然结果同时包含Perez
和pérez
两个实例,但我也会得到一些显然与查询无关的结果
在西班牙语中,这种情况经常发生……不管是懒散,不管你想叫它什么,事实是,对于这种事情,人们往往不写重音,因为假设所有这些搜索都可以同时使用这两种选项(我猜,既然谷歌允许,每个人都认为它应该是这样工作的)
除了更新数据库、删除所有重音符号并在查询中修剪它们之外……你能想出另一种解决方案吗?你的~和=在上面进行了交换。应该是(cn~=Perez)。我仍然不知道这会有多好。Soundex一直都很奇怪。因为许多属性都是多值的,包括cn,所以您可以在属性上存储第二个值,该属性将扩展字符转换为其基本版本。您至少可以在需要时保留原始值。您还可以设置并在转换后的值前面加上前缀,然后使用valuesReturnFilter将其从结果中过滤出来
#Sample object
dn:cn=Pérez,ou=x,dc=y
cn:Pérez
cn:{stripped}Perez
sn:Pérez
#etc.
然后修改查询以使用or表达式
(|(cn=Pérez)(cn={stripped}Perez))
您将包括一个valuesReturnFilter,它看起来像
(!(cn={stripped}*))
有关详细信息,请参阅RFC3876。添加请求控件的方法因用于访问目录的平台/库而异。搜索筛选器(“查询”)由指定
编码:
实际上要求过滤器(间接定义)是
,即ASCII 8字节字符串:
是八进制字符串,
和是LDAPString,LDAPString是一个八位组字符串。 转义标准:使用“\”替换特殊字符 (,示例)。 引述: 该规则确保整个筛选器字符串为 有效的UTF-8字符串,并提供表示 ASCII字符“*”(ASCII 0x2a),“(“(ASCII 0x28),”)”(ASCII 0x29)、“\”(ASCII 0x5c)和NUL(ASCII 0x00)是 表示为反斜杠“\”(ASCII 0x5c),后跟两个十六进制数字 表示编码的八位字节的值。
此外,您可能应该替换所有在语义上修改过滤器的字符(RFC 4515的语法提供了一个列表),并用通配符(*)替换非ASCII字符的正则表达式(Regex)。这也将帮助您处理诸如“é”之类的字符。因此,对于字符串,~=指定基于Soundex()的匹配?