使用openldap进行近似搜索

时间:2011-11-28 17:36:10

标签: ldap openldap

我正在尝试编写一个搜索运行openldap的目录服务器的搜索。

用户将使用他们感兴趣的人的名字或姓氏进行搜索。

我发现重音字符有问题(比如áéíóú),因为名字和姓氏都是用西班牙语写的,所以虽然正确的方法是Pérez,但为了搜索,它可以写成为Perez,没有重音。

如果我使用'(cn=*Perez*)',我只会得到非重音结果。

如果我使用'(cn=*Pérez*)',我只会获得重音结果。

如果我使用'(cn=~Perez)'我会得到奇怪的结果(或者至少我无法使用,因为虽然结果包含PerezPérez次发生,但我也得到了一些明显的结果与查询无关......

在西班牙语中,这种情况发生了很多...无论是懒惰,无论你想称之为什么,事实是,对于这种事情,人们往往不会写重音,因为它可以保证所有这些搜索都适用于这两个选项(我猜是因为Google允许它,所以每个人都认为它应该以这种方式工作)。

除了更新数据库并删除所有重音并在查询中修剪它们之外......你能想到另一种解决方案吗?

1 个答案:

答案 0 :(得分:0)

搜索过滤器(“查询”)由RFC2254指定。

编码: RFC2254 实际上需要过滤器(间接定义)为 OCTET STRING,即ASCII 8字节字符串: AttributeValue是OCTET STRING, MatchingRuleIdAttributeDescription
是LDAPString,LDAPString是OCTET STRING。  

转义标准:使用“\”替换特殊字符 ( http://tools.ietf.org/html/rfc4515#page-4,示例 http://tools.ietf.org/html/rfc4515#page-5)。 引用:

< valueencoding>规则确保整个过滤字符串是a 有效的UTF-8字符串,并提供表示的八位字节 ASCII字符“*”(ASCII 0x2a),“(”(ASCII 0x28),“)”(ASCII 0x29),“\”(ASCII 0x5c)和NUL(ASCII 0x00) 表示为反斜杠“\”(ASCII 0x5c),后跟两个十六进制数字 表示编码的八位字节的值。

此外,您应该替换所有语义修改过滤器的字符(RFC 4515的语法给出列表),并使用通配符(*)替换非ASCII字符以确保。这也可以帮助您使用“é”等字符。