【问题标题】:SQLite Fts select querySQLite Fts 选择查询
【发布时间】:2014-04-29 19:12:29
【问题描述】:

我正在制作一本包含 20,000 多个单词的字典。因此,为了使其在搜索数据时更快地工作,我使用 fts3 表来执行此操作。 我的选择查询:
Cursor c=db.rawQuery("Select * from data where Word MATCH '"+word+"*'", null);

使用此查询,它将显示所有包含 'word' 的单词,但我想要的是仅获取包含搜索单词开头的单词。 意味着我希望它像这个查询一样工作:

Cursor c=db.rawQuery("Select * from data where Word like '"+word+"%'", null);

例如:我有:apple、app 和 book、bad、cat、car。 当我输入“a”时:我希望它只显示:apple、app 和

我能用这个解决什么问题?

【问题讨论】:

  • 你完成了多少实现??
  • 什么是 db .schema ?
  • 表(_id主键不为空自增,word文本)
  • 我想知道你是否需要。 fts 那么如果你只有一个简单的文本列
  • 因为超过20,000字,如果我不使用fts,搜索时会变慢

标签: android database sqlite search full-text-search


【解决方案1】:
table(_id primary key not null autoincrement, word text) 

FTS 表不使用上述属性。它忽略数据类型。它不会自动增加隐藏的 rowid 列以外的列。 “_id”在这里不会作为主键。请确认您正在实施 FTS 表

https://www.sqlite.org/fts3.html

可以选择为每列指定数据类型名称。这是 纯语法糖,提供的类型名不被 FTS 使用或 用于任何目的的 SQLite 核心。这同样适用于任何约束 与 FTS 列名一起指定 - 它们被解析但不被使用 或以任何方式被系统记录

至于您的原始问题,匹配“abc *”已经从单词的开头搜索。例如匹配“man*”将不匹配“woman”。

【讨论】:

    【解决方案2】:

    FTS 支持以^ 搜索字符串的开头:

    SELECT * FROM FtsTable WHERE Word MATCH '^word*'
    

    但是,全文搜索索引旨在查找较大文本中的单词。

    如果您的Word 列仅包含一个单词,那么如果您使用LIKE 'a%' 并依赖普通索引,您的查询效率会更高。 要允许索引与 LIKE 一起使用,表列必须有 TEXT affinity,并且索引必须声明为 COLLATE NOCASE(因为 LIKE 不区分大小写):

    CREATE TABLE data (
        ...
        Word TEXT,
        ...
    );
    CREATE INDEX data_Word_index ON data(Word COLLATE NOCASE);
    

    如果您要改用 GLOB,则索引必须区分大小写(默认设置)。

    可以使用EXPLAIN QUERY PLAN查看查询是否使用索引:

    sqlite> EXPLAIN QUERY PLAN SELECT * FROM data WHERE Word LIKE 'a%';
    0|0|0|SEARCH TABLE data USING INDEX data_Word_index (Word>? AND Word<?)
    

    【讨论】:

    • 你能告诉我关于用 ^ 搜索字符串的开头,如果我使用:Cursor c=db.rawQuery("Select * from data where Word MATCH '^"+word+"*' “, 空值);对吗?
    • @CL。看来你是一个 sql[ite] 大师,你知道为什么 glob 比 like 快得多,或者反过来,反正一个比另一个快得多
    • 你能在这里详细解释一下你的代码吗:sqlite> EXPLAIN QUERY PLAN SELECT * FROM data WHERE Word LIKE 'a%'; 0|0|0|使用索引搜索表数据 data_Word_index (Word>?AND Word)
    • @user3106128 在任何交互式工具中运行该查询(在本例中,我使用了sqlite3 命令行外壳)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多