簡體   English   中英

在sqlite中重音搜索(android)

[英]Accented Search in sqlite (android)

我有一個列,其中一些元素包含重音字母。 例如:Grambú

我的要求是,當我搜索“Grambu”時,我也應該在結果中獲得“Grambú”。

對於此要求,我嘗試對該特定列使用“COLLATE NOCASE”參數。 但那沒有用。

當我在網上搜索解決方案時,我發現許多人建議對重音字符進行規范化,並根據它創建另一個列作為唯一選項。

這個問題還有其他更簡單的解決方案嗎?

COLLATE NOCASE 僅適用於ASCII的26個大寫字符

使用setLocale()將數據庫的語言環境設置為具有重音字符支持的語言環境,並使用COLLATE LOCALIZED

您也可以嘗試使用COLLATE UNICODE 但要注意這個錯誤: 在ICS中打破SQLite UNICODE排序 - 不再不區分大小寫

查看文檔,了解Android中這兩個整理器的提及情況。

另請查看此在線整理演示工具

http://www.sqlite.org/lang_expr.html

(一個錯誤:默認情況下,SQLite只能理解ASCII字符的大寫/小寫。對於超出ASCII范圍的unicode字符,LIKE運算符默認區分大小寫。例如,表達式'a'LIKE'A'為TRUE但是'æ'LIKE'Æ'是假的。)

在Android sqlite中, LIKEGLOB忽略COLLATE LOCALIZEDCOLLATE UNICODE 但是,有一個解決方案,無需在表中添加額外的列。 正如@asat在本回答中所解釋的那樣,您可以使用GLOB ,其模式將用該字母的所有可用替代字替換每個字母。 在Java中:

public static String addTildeOptions(String searchText) {
    return searchText.toLowerCase()
                     .replaceAll("[aáàäâã]", "\\[aáàäâã\\]")
                     .replaceAll("[eéèëê]", "\\[eéèëê\\]")
                     .replaceAll("[iíìî]", "\\[iíìî\\]")
                     .replaceAll("[oóòöôõ]", "\\[oóòöôõ\\]")
                     .replaceAll("[uúùüû]", "\\[uúùüû\\]")
                     .replace("*", "[*]")
                     .replace("?", "[?]");
}

然后(當然不是這樣的):

SELECT * from table WHERE lower(column) GLOB "*addTildeOptions(searchText)*"

這樣,搜索GrambuGrambú的用戶將搜索轉換為Gramb [uúùüû] ,返回兩個結果。

重要的是要注意GLOB忽略COLLATE NOCASE ,這就是我在函數和查詢中將所有內容都轉換為小寫的原因。 另請注意,sqlite中的lower()函數不適用於非ASCII字符 - 但這些可能是您已經替換的那些!

該函數還替換了GLOB通配符, *? ,“逃脫”版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM