SQLite的全文搜索与符号化问题
20130213更正:
下面的'"明 日 *"'应改为'明 日 *'(把双层引号改为单层引号),将获得更多匹配结果。
20130321:
还可以在where条件中加入like或glob(同时使用match和like)以减少结果数量(或者加入其它条件)
Android自带的sqlite3通过fts3(是fulltext search engine 3的缩写?)模块支持全文搜索。但官方文档说只支持三种符号化,而且只支持完全和前缀匹配(也就是说,分割的符号只能完全或前方匹配搜索字符串),默认是不支持后缀和中缀搜索。如果要解决这个问题,需要做一些特殊处理。我看到网上的讨论,大概有以下方法:
(1)创建一个反转字符串的列,就可以实现后缀匹配
(2)使用类似MeCab的分词库,把目标串符号化。
不过我觉得这两种方法都是有一定的限制。方法二虽然比较好,但我觉得还是有点复杂。
我觉得符号化(分词)不一定要很精确,比如”我是中国人“只要符号化为”我 是 中 国 人 “就可以了。
所以我在创建符号化列时使用这样的逻辑(用Java处理):
private static String tokenize(String str) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++) { sb.append(str.charAt(i)); sb.append(' '); } return sb.toString(); }
假设创建的符号化列为word_tokenize,搜索字符串为”明日“,那么查询语句是(注意搜索的非英文字符串”明日“也要被符号化)
select word, meaning, dict_id from words where word_tokenize match '"明 日 *"' order by rowid;
不过这样做的坏处是很明显的,因为英文单词会被分割成可以任意连结,而且搜索速度会减慢。
或者这样符号化会好些——
private static String tokenize(String str) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); sb.append(c); if (c > 256) { sb.append(' '); } } return sb.toString(); }
相关推荐
yanweiqi 2020-06-25
molong0 2020-06-13
PasserbyX 2020-05-16
wenwentana 2020-02-21
明瞳 2020-01-10
kekenow 2019-10-22
lhc0 2019-07-11
繌子 2017-12-18
繌子 2014-12-10
随手一记 2013-08-13
exitzhang 2012-11-22
YEEHOLIC 2019-06-29
fanix 2019-06-28
zhengsj 2013-01-27
EdShao 2019-06-27
看上去很美 2019-06-27
PasserbyX 2019-06-26
especialjie 2010-03-08