SQLite、文本搜索 FTS 等

Posted

技术标签:

【中文标题】SQLite、文本搜索 FTS 等【英文标题】:SQLite, text search FTS etc 【发布时间】:2016-04-23 22:15:42 【问题描述】:

我正在使用 SQLite3 对一些旧的 D5 业务(朋友免费赠品)进行一些更新和修复,因此必须使用 Zeos 6.6

我想加快当前使用两个 BLOB_TEXT 字段“类”和“方法”的文本搜索

if not(cbSearchMatchCase.Checked) then
  SearchText:=UpperCase(SearchText);
while not(dm.tbl.EOF) do
begin
  SearchData:=dm.tbl.FieldByName(fldClass).AsString+' '+
              dm.tbl.FieldByName(fldMethods).AsString;
  if not(cbSearchMatchCase.Checked) then
    SearchData:=UpperCase(SearchData);
  MatchFound:=AnsiPos(SearchText,SearchData) > 0;
  dm.tbl.Edit;
  dm.tbl.FieldByName(fldSearch).AsBoolean:=MatchFound;
  dm.tbl.Post;
  pbMain.StepIt;
  dm.tbl.Next;
end;

谁能指出一些使用 SQLite FTS 扩展或比上述更快的代码?

我发现了这一点,但由于太多原因无法在此处定义。我确信它可以工作,因为 Žarko Gajić 的东西总是在现场,但只是不工作这个安装。 :) http://zarko-gajic.iz.hr/full-text-txt- ... g-project/

只需在此处找到此链接... Does BLOB data types in SQLite supports FULL-text search?

这可以解释为什么似乎没有任何效果,BLOB_TEXT 被忽略了?是的?没有?

是否有任何 sn-ps 可以加快此文本搜索的速度?

【问题讨论】:

一件事是不要遍历FieldByName。在循环外声明一个TField := dm.tbl.FieldByName(fldClass),在里面使用TField.AsString。 @JanDoggen 谢谢,但这仅减少了测试数据库中 600 条记录的 0.8 秒,而我们有 20,000 条真实记录。目前以每 1000 秒 18 秒的速度运行搜索。为了产生任何影响,我需要让 FTS4 正常工作。 【参考方案1】:

为什么不在类/方法上创建索引?可以是表达式索引:https://www.sqlite.org/expridx.html,也可以是复杂的。我会从小写开始,如果需要区分大小写,我会重新过滤。

【讨论】:

以上是关于SQLite、文本搜索 FTS 等的主要内容,如果未能解决你的问题,请参考以下文章

SQlite 全文搜索(FTS)?

如何增加 Sqlite FTS4 片段大小

SQLite、FTS、MATCH 和分隔列中的文本

使用 sqlite 的 FTS 片段函数处理 html 转义

Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?

PhoneGap、SQLite 和全文搜索