2011-11-28 116 views
0

我正在尝试编写一个查询我们的目录服务器运行openldap的搜索。使用openldap进行近似搜索

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

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

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

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

如果我使用'(cn=~Perez)'我得到奇怪的结果(或至少没有什么我可以使用,因为虽然结果中含有PerezPérez ocurrences,我也得到了一定的成果,显然无关与查询...

在西班牙语中,这发生了很多......无论是你想要称之为懒惰,事实是,对于这种事情,人们往往不写出口音,因为它假定所有这些搜索都与这两个选项(我猜,因为谷歌允许它,每个人都认为它应该这样工作)。

除了更新d atabase并删除所有重音并修改它们在查询中......你能想到另一种解决方案吗?

回答

0

你有你的〜和=上面交换。它应该是(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. 

然后修改您的查询以使用或表达式。

(|(cn=Pérez)(cn={stripped}Perez)) 

你将包括一个看起来像

(!(cn={stripped}*)) 

参见RFC3876 http://www.networksorcery.com/enp/rfc/rfc3876.txt细节上的valuesReturnFilter。添加请求控件的方法因您用于访问目录的平台/库而异。

+0

因此,对于字符串,〜=指定基于Soundex(http://en.wikipedia.org/wiki/Soundex)的匹配? – RobertG

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

此外,你应该替换语义修改过滤器(RFC 4515的语法给出了一个列表)中的所有字符,并做了正则表达式,使用通配符替换的非ASCII字符(*),以确保万无一失。这也可以帮助你像“é”这样的角色。