如何在Sqlite Android中实现单词边界?

如何在Sqlite Android中实现单词边界?,第1张

概述我想实现以下(全文搜索), SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]' 我只对全文列中的精确字符串(而不仅仅是单词)感兴趣. 我一直在使用MySQL中的确切SQL,现在将大部分代码迁移到Android应用程序. 但我一直在查看各种帖子,其中提到Android Sqlite不支持REGEXP( 我想实现以下(全文搜索),
SELECT * FROM @R_502_5991@name where columnname REGEXP '[[:<:]]some string[[:>:]]'

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

我一直在使用MysqL中的确切sql,现在将大部分代码迁移到AndroID应用程序.

但我一直在查看各种帖子,其中提到AndroID sqlite不支持REGEXP(例如:link1,link2,link3).

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

如果没有上述sql的替代品?

谢谢,

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

androID.database.sqlite.sqliteException: no such function: REGEXP (code 1):...

我知道我们可以使用GLOB和liKE(或者甚至可以使用MATCH).如何将columnname REGEXP'[[:<:]] somestring [[:>:]]’转换为使用GLOB和/或liKE和/或MATCH?

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

SELECT * FROM @R_502_5991@name 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 @R_502_5991@name 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 @R_502_5991@name where columnname REGEXP '[[:<:]]some string[[:>:]]'

你可以在sqlite中试试这个:

SELECT * FROM @R_502_5991@name 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 @R_502_5991@name 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');
总结

以上是内存溢出为你收集整理的如何在Sqlite Android中实现单词边界?全部内容,希望文章能够帮你解决如何在Sqlite Android中实现单词边界?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存