【问题标题】:Approximate search with openldap使用 openldap 进行近似搜索
【发布时间】:2011-11-28 17:36:09
【问题描述】:

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

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

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

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

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

如果我使用 '(cn=~Perez)',我会得到奇怪的结果(或者至少没有我可以使用的结果,因为虽然结果同时包含 PerezPérez 出现,但我也会得到一些显然与查询...

在西班牙语中,这种情况经常发生......无论是懒惰,无论你想怎么称呼它,事实是对于这种事情,人们倾向于不写口音,因为它假定所有这些搜索都适用两种选择(我想既然谷歌允许这样做,每个人都认为它应该以这种方式工作)。

除了更新数据库并删除所有重音并在查询中修剪它们...您能想到其他解决方案吗?

【问题讨论】:

    标签: ldap openldap


    【解决方案1】:

    你有你的 ~ 和 = 上面交换。应该是 (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 http://www.networksorcery.com/enp/rfc/rfc3876.txt。添加请求控件的方法因您用于访问目录的平台/库而异。

    【讨论】:

    【解决方案2】:

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

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

    转义标准:使用“”替换特殊字符 (https://www.rfc-editor.org/rfc/rfc4515#page-4,示例https://www.rfc-editor.org/rfc/rfc4515#page-5)。 引用:

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

    此外,您可能应该替换所有在语义上修改过滤器的字符(RFC 4515 的语法给出了一个列表),并使用通配符 (*) 进行正则表达式替换非 ASCII 字符以确保。这也将帮助您处理诸如“é”之类的字符。

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多