0

更新:最後,我使用Java6 Normalizer找出哪些字符是a-zA-Z的擴展。所以現在所有奇怪的字符都被翻譯成這50個ASCII字母。輸入/自動完成時不會顯着減慢速度。搜索API:「Ondřej」如何與「ondrej」匹配?我需要在瀏覽器中模仿


使用什麼算法執行GAE Search API處理字符串?

爲了優化目的(在瀏覽器中),我需要模擬對「索引」字符串進行的任何處理,然後才能與索引進行匹配。 基本上它意味着翻譯 「怪異」 字符到其 「無聊」(和小寫)表示:

  • R,R => R
  • E,E,E,E,E,E =>電子
  • ...

有一些標準化的(或至少是「衆所周知」)轉換表,所以我不會錯過一些字符?

+0

這個問題根本不涉及任何GAE標籤。 –

+0

搜索API是Google AppEngine平臺 –

+0

內的一項服務https://github.com/FGRibreau/node-unidecode仍然太大而無法在瀏覽器中使用,但可能對您有所幫助。 –

回答

0

最後,我硬編碼的地圖,其中關鍵是「普通」字符和值包含字符串連接所有的關鍵的「怪異」的版本。 (在Java中的每一個「怪異」的人物知道什麼是它的「平淡」對應。)

在Java中,你可以使譯文是這樣的:

String dropAccents(String weirdCharacter) { 
    return java.text.Normalizer.normalize(weirdCharacter, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
} 

...你叫這個爲65個字符.91(大寫)和97..123(小寫)

初始化這種映射的JavaScript/Java代碼大約有50條相當短的行。

translationTable.put("A", "ÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦḀẠẢẤẦẨẪẬẮẰẲẴẶÅ"); 
translationTable.put("B", "ḂḄḆ"); 
translationTable.put("C", "ÇĆĈĊČḈ"); 
translationTable.put("D", "ĎḊḌḎḐḒ"); 
translationTable.put("E", "ÈÉÊËĒĔĖĘĚȄȆȨḔḖḘḚḜẸẺẼẾỀỂỄỆ"); 
translationTable.put("F", "Ḟ"); 
translationTable.put("G", "ĜĞĠĢǦǴḠ"); 
translationTable.put("H", "ĤȞḢḤḦḨḪ"); 
translationTable.put("I", "ÌÍÎÏĨĪĬĮİǏȈȊḬḮỈỊ"); 
translationTable.put("J", "Ĵ"); 
translationTable.put("K", "ĶǨḰḲḴK"); 
translationTable.put("L", "ĹĻĽḶḸḺḼ"); 
translationTable.put("M", "ḾṀṂ"); 
translationTable.put("N", "ÑŃŅŇǸṄṆṈṊ"); 
translationTable.put("O", "ÒÓÔÕÖŌŎŐƠǑǪǬȌȎȪȬȮȰṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢ"); 
translationTable.put("P", "ṔṖ"); 
translationTable.put("R", "ŔŖŘȐȒṘṚṜṞ"); 
translationTable.put("S", "ŚŜŞŠȘṠṢṤṦṨ"); 
translationTable.put("T", "ŢŤȚṪṬṮṰ"); 
translationTable.put("U", "ÙÚÛÜŨŪŬŮŰŲƯǓǕǗǙǛȔȖṲṴṶṸṺỤỦỨỪỬỮỰ"); 
translationTable.put("V", "ṼṾ"); 
translationTable.put("W", "ŴẀẂẄẆẈ"); 
translationTable.put("X", "ẊẌ"); 
translationTable.put("Y", "ÝŶŸȲẎỲỴỶỸ"); 
translationTable.put("Z", "ŹŻŽẐẒẔ"); 
translationTable.put("a", "àáâãäåāăąǎǟǡǻȁȃȧḁạảấầẩẫậắằẳẵặ"); 
translationTable.put("b", "ḃḅḇ"); 
translationTable.put("c", "çćĉċčḉ"); 
translationTable.put("d", "ďḋḍḏḑḓ"); 
translationTable.put("e", "èéêëēĕėęěȅȇȩḕḗḙḛḝẹẻẽếềểễệ"); 
translationTable.put("f", "ḟ"); 
translationTable.put("g", "ĝğġģǧǵḡ"); 
translationTable.put("h", "ĥȟḣḥḧḩḫẖ"); 
translationTable.put("i", "ìíîïĩīĭįǐȉȋḭḯỉị"); 
translationTable.put("j", "ĵǰ"); 
translationTable.put("k", "ķǩḱḳḵ"); 
translationTable.put("l", "ĺļľḷḹḻḽ"); 
translationTable.put("m", "ḿṁṃ"); 
translationTable.put("n", "ñńņňǹṅṇṉṋ"); 
translationTable.put("o", "òóôõöōŏőơǒǫǭȍȏȫȭȯȱṍṏṑṓọỏốồổỗộớờởỡợ"); 
translationTable.put("p", "ṕṗ"); 
translationTable.put("r", "ŕŗřȑȓṙṛṝṟ"); 
translationTable.put("s", "śŝşšșṡṣṥṧṩ"); 
translationTable.put("t", "ţťțṫṭṯṱẗ"); 
translationTable.put("u", "ùúûüũūŭůűųưǔǖǘǚǜȕȗṳṵṷṹṻụủứừửữự"); 
translationTable.put("v", "ṽṿ"); 
translationTable.put("w", "ŵẁẃẅẇẉẘ"); 
translationTable.put("x", "ẋẍ"); 
translationTable.put("y", "ýÿŷȳẏẙỳỵỷỹ"); 
translationTable.put("z", "źżžẑẓẕ"); 
1

使用unidecode python庫。

>>> import unidecode 
>>> unidecode.unidecode(u'ř') 
'r' 
>>> unidecode.unidecode(u'ě,é,ë,Ě,É,Ë') 
'e,e,e,E,E,E' 
>>> unidecode.unidecode(u'ě,é,ë,Ě,É,Ë').lower() 
'e,e,e,e,e,e' 
+0

那麼我需要在瀏覽器中做到這一點。 –