V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
galaxyz
V2EX  ›  数据库

Sqlite 怎么快速查询码表的问题

  •  
  •   galaxyz · 2018-11-01 23:21:12 +08:00 · 1508 次点击
    这是一个创建于 2245 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Sqlite 怎么快速查询码表的问题

    本人开发一个笔画类输入法,有一个问题困扰很久,在安卓上打词汇很卡。中文词汇的 Sqlite 笔画码表是这样的:

    wordtable word stroke 输入法 1521341251122<1>34<2>44112154 注:<1>表示分隔符

    用过笔画的同学都知道,打词时每个字打前几笔就行了,因此要打「输入法」只要打「 152'3'441 」就应该匹配到「输入法」了,Sqlite 查询语句是:select word from wordtable where stroke glob '152*<1>3*<2>441*',但这样很卡(词库很大,只匹配到 4 个词),主要原因是检索式耗费资源,为此使用 in 语句缩小查询范围,改为:select word from wordtable where stroke glob '152*<1>3*<2>441*' and stroke in (select stroke from wordtable where stroke glob '152*') 。修改后有所改善,但是仍然有卡顿感,离流畅还有差距。

    其他想到的可能的办法,但是还没有找到实例: 1。 把第一次查询的结果先保存下来,供第二次查询使用? 2。 把第一次查询的结果做为一个新表存在 db 里,用完再删?增加了写和删的操作会更费时吧?

    有什么更好的办法吗?

    注:

    使用 java 开发,AS,import android.xxx.sqlite 只在安卓卡,在 iOS 上不卡,iOS 使用开源 Swift Sqlite 开发。 安卓输入法体验: https://www.coolapk.com/apk/com.Eonsoft.android.softkeyboard

    7 条回复    2019-01-26 18:40:19 +08:00
    mind3x
        1
    mind3x  
       2018-11-02 00:10:55 +08:00 via Android
    这事得用 Trie
    ddup
        2
    ddup  
       2018-11-02 07:16:20 +08:00 via Android
    我上次发的 fts 方案不行嘛?那就只能分表了。
    比如,两个字的词是这个表,三个字的存另一个表,
    还可以再细,比如数字 1 到 5 开头的一个表,其它存 2 表

    但也不要分太多表,多了影响首次启动速度
    ddup
        3
    ddup  
       2018-11-02 07:19:43 +08:00 via Android
    我还是觉得 SQLite FTS 应是可以满足你的需求的,什么愿意使你没有用这个?
    galaxyz
        4
    galaxyz  
    OP
       2018-11-02 18:15:32 +08:00 via Android
    @ddup 谢谢,我之前查过 fts,是全文检索吧?没太看懂怎么用,比方说,我的需求是包含多个*的检索式,检索对象是一个单列很多行的表,和全文检索是什么对应关系?请赐教。
    ddup
        5
    ddup  
       2018-11-02 20:14:36 +08:00 via Android   ❤️ 1
    @galaxyz 你的需求我看了,SQLite FTS 是可以实现的。
    可以看看官方的 FTS3 文档,可以满足你的需求。
    galaxyz
        6
    galaxyz  
    OP
       2018-11-02 20:31:01 +08:00 via Android
    @ddup 谢谢,正在看
    galaxyz
        7
    galaxyz  
    OP
       2019-01-26 18:40:19 +08:00
    @ddup 抱歉现在才来回复怎么解决的:实际上没有用 FTS,问题出在两个地方:( 1 )对 db 建立索引,( 2 )在 Sqlite 查询语句中排序而不是自己的代码对查询结果排序。本来这两点我是都知道且试过的,但是没有同时应用( 1 )和( 2 ),这就造成了没建索引的时候用 Sqlite 语句排序,或者是建了索引的时候自己排序,都是很低效的,让我误以为都没什么用。两个一起用就好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 19:01 · PVG 03:01 · LAX 11:01 · JFK 14:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.