2011-11-28 117 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字符(*),以確保萬無一失。這也可以幫助你像「é」這樣的角色。