如何在Sqlite Android中实现单词边界?
我想实现以下(全文搜索),SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]' 我只对全文列中的精确字符串(而不仅仅是单词)感兴趣. 我一直在使用MySQL中的确切SQL,现在将大部分代码迁移到Android应用程序. 但我一直在查看各种帖子,其中提到Android Sqlite不支持REGEXP(例如:link1,link2,link3). 有没有办法在Android中启用REGEXP? 如果没有上述SQL的替代品? 谢谢, 编辑: android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):... 我知道我们可以使用GLOB和LIKE(或者甚至可以使用MATCH).如何将columnname REGEXP'[[:<:]] somestring [[:>:]]’转换为使用GLOB和/或LIKE和/或MATCH? 解决方案1: SELECT * FROM tablename where (columnname GLOB '*some string*' OR columnname GLOB '*Some string*') AND ( ( (columnname GLOB '*[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]*' AND columnname GLOB '*some string[^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_]some string*') OR (columnname GLOB '*[^a-zA-Z0-9_]Some string[^a-zA-Z0-9_]*' AND columnname GLOB '*Some string[^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_]Some string*') ) ) GLOB区分大小写,所以我有一个额外的OR 在我的情况下,@cybersam的第二个解决方案要快得多. 解决方案2:处理灵敏度不足的情况 SELECT * FROM tablename where (columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') AND ( ( columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') )要实际支持REGEXP,您必须添加自己的 regexp() user function. This link可能会帮助您弄清楚如何为Android创建用户定义的函数 – 但这并不简单. 如果您的模式非常简单,那么GLOB operator可能就足够了. 例如,要执行与此MYSQL查询等效的搜索: SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]' 你可以在SQLite中试试这个: SELECT * FROM tablename where columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR columnname GLOB 'some string[^a-zA-Z0-9_]' OR columnname GLOB '[^a-zA-Z0-9_]some string' OR columnname GLOB 'some string'; 上面的查询使用了这样的事实:在MYSQL中,单词字符被定义为字母数字字符或下划线.需要额外的OR术语以匹配某些字符串的任一侧(或两侧)上没有文本的情况. 最后,如果’some string’在columnname中相对较少,那么以下较长的查询实际上可能更快,因为它只会对少数值进行多次GLOB评估: SELECT * FROM tablename where columnname GLOB '*some string*' AND ( columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR columnname GLOB 'some string[^a-zA-Z0-9_]' OR columnname GLOB '[^a-zA-Z0-9_]some string' OR columnname GLOB 'some string'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |