【问题标题】:How to achieve word boundary in Sqlite Android?如何在 Sqlite Android 中实现字边界?
【发布时间】:2015-03-29 11:58:49
【问题描述】:

我想实现以下(全文搜索),

SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'

我只对全文列中的确切字符串(而不仅仅是单词)感兴趣。

我一直在 MySQL 中使用上面的确切 SQL,现在将大部分代码迁移到 android 应用程序。

但我一直在查看各种帖子,其中提到 Android Sqlite 不支持 REGEXP(例如:link1link2link3)。

有没有办法在 Android 中启用 REGEXP?

如果没有,上述 SQL 是否有替代方案?

谢谢,

编辑: 目前我在 Android 中使用 REGEXP 时收到以下异常,

android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):...

我知道我们可以使用 GLOB 和 LIKE (甚至可能是 MATCH )。如何将columnname REGEXP '[[:&lt;:]]somestring[[:&gt;:]]' 转换为使用GLOB 和/或LIKE 和/或MATCH

解决方案 1: 在@cybersam 的帮助下,我正在使用以下内容(经过一些修改)

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]*')
)

【问题讨论】:

  • 试试这个\&lt;somestring\&gt;

标签: android regex sqlite word-boundary


【解决方案1】:

要真正支持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 的任何一侧(或两侧)都没有文本的情况。

最后,如果'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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多