问题标签 [fts4]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
824 浏览

python - sqlite fts3/fts4 中的信息存储

我打算在 python(python3) 中创建一个简单的搜索引擎。通过 sqlite fts3/fts4 的文档,我选择存储文档,因为全文搜索很快。我已经有一组网页,他们文本提取并保存在文本文件中。
因此,我计划通过以下方式创建 fts4 表:


然后我将遍历文本文件,将其存储在一个字符串中,并将该字符串连同名称和 docid 插入到 fts 表中(从 1 到 n 的整数,其中 n 是总文档)
但是 sqlite 文档中的以下语句有我困惑并且不确定我的上述代码是否有效:
虚拟表是外部存储或计算引擎的接口,它看起来是一个表,但实际上并未将信息存储在数据库文件中。
那么信息将存储在哪里?如果它是一个常规的 sqlite 表,我将首先创建一个数据库文件并在这个数据库文件中创建表。如果我必须在另一台机器上使用相同的数据库,我只需复制这个文件并将其粘贴到该机器上。我可能遗漏了文档中的某些内容,但我想在实施之前明确信息将如何存储。

0 投票
1 回答
1272 浏览

sqlite - PhoneGap、SQLite 和全文搜索

我们正在尝试确定一个具有相对复杂的搜索功能的项目。例如,它需要搜索单词的变体——“legal”和“legally”被视为相同。

我相信 SQLite 全文扩展(FTS3、FTS4)会做我们需要的一切,但我不知道这是否是一个选项。有没有人在 PhoneGap 应用程序中成功使用 SQLite 和 FTS3 或 FTS4?

如果没有,有没有人知道任何可以在 PhoneGap 中使用的强大替代方案?

0 投票
3 回答
1829 浏览

sqlite - How to stop . being treated as a separator in SQLite FTS4

I want to be able to search for numbers like 2.3 using FTS4 in SQLite, but the . is being treated as a token boundary. Short of writing a full bespoke tokenizer is there any other way of excluding the . from the list of token boundary characters?

Being able to search for decimal numbers seems like a common use case, but I can't find anything relevant on SO / Google. My best solution at present is to replace all . chars in the text with a known (long) string of letters and substitute accordingly on each search...

Peter

0 投票
2 回答
691 浏览

android - Need to tweak my FTS4 SQLite query

The query below doesn't work on Android and throws the following exception

Unable to use function MATCH in the requested context

It is a pretty complicated query so I'm looking into ways of simplifying it. For info, this query works on the same database on my computer with the sqlite-jdbc-3.715 driver

I think my FTS table declaration is OK:

Could an SQL guru help me out? Thanks

EDIT: I found out that even the simplest query such as

fails with the same error. I already use MATCH statements on another database somewhere else in my code and it doesn't complain at all. Does the context mentionned in the error message has anything to do with Android's Context?

0 投票
1 回答
5409 浏览

ios - iOS SQLite 全文搜索示例

我正在尝试构建一个利用 SQLite FTS 的应用程序。我发现了一篇关于如何按照我想要的方式执行此操作的非常有趣的帖子。但是,我根本不是一个非常有经验的程序员,尤其是在这篇文章中使用的 CoreData 中。是否有任何示例项目与本文中描述的内容类似?看看在上下文中做了什么对我有很大帮助。如果这是一个愚蠢的问题,我很抱歉,我对这一切还很陌生。感谢您对此的任何帮助!

这是文章的链接:http: //blog.lunatech.com/2013/01/24/ios-core-data-sqlite-full-text-search

0 投票
2 回答
782 浏览

android - Android Sqlite FTS NOT 操作

我正在尝试订购快速文本搜索,以便完全匹配是第一个,部分匹配是最后一个。

我创建了一个在 SQLiteStudio 中工作的查询:

所以结果是

这很好用,但是当我在 android 中使用相同的查询时,我只会得到

回来,因为它似乎在解释:

作为

这是怎么回事?

0 投票
1 回答
4794 浏览

sqlite - 如何获得更快的按另一个表中的字段排序的 FTS4 查询结果?

背景

我正在利用其出色的内置FTS4引擎对存储在 SQLite 中的电子邮件正文实施全文搜索。我得到了一些相当糟糕的查询性能,尽管并不完全符合我的预期。让我们来看看。

代表模式

我将给出一些相关代码的简化示例,并在适用的情况下提供完整代码的链接。

我们有一个MessageTable存储有关电子邮件信息的数据(完整版本分布在此处此处此处的多个文件中):

可搜索的文本被添加到名为MessageSearchTable(完整版在这里)的 FTS4 表中:

搜索表id中的 充当消息表的外键。

我将把它作为练习留给读者将数据插入这些表中(我当然不能提供我的私人电子邮件)。我在每个表中只有不到 26k 条记录。

问题查询

当我们检索搜索结果时,我们需要它们按降序排列,internaldate_time_t这样我们就可以只提取最近的几个结果。这是一个示例搜索查询(此处为完整版):

在我的机器上,我的电子邮件在大约 150 毫秒内运行,通过以下方式测量:

150 毫秒并不是一个查询的野兽,但对于简单的 FTS 查找和索引顺序来说,它是缓慢的。例如,如果我省略ORDER BY,它将在 10 毫秒内完成。还要记住,实际查询还有一个子选择,所以一般来说还有一些工作要做:查询的完整版本在大约 600 毫秒内运行,这是野兽领域,ORDER BY在这种情况下省略将时间缩短 500 毫秒。

如果我打开内部统计信息sqlite3并运行查询,我会注意到以下行:

如果我对有关这些统计信息的文档的解释是正确的,那么查询似乎完全跳过了使用MessageTableInternalDateTimeTIndex. 完整版的查询也有这行:

听起来它正在某个地方走桌子,但现在让我们忽略它。

我发现了什么

因此,让我们稍微优化一下。我可以将查询重新排列为子选择并强制 SQLite 使用带有INDEXED BY扩展名的索引:

瞧,运行时间已经下降到大约 100 毫秒(查询的完整版本为 300 毫秒,运行时间减少了 50%),并且没有报告任何排序操作。请注意,仅像这样重新组织查询但不强制使用 索引INDEXED BY,仍然有一个排序操作(尽管我们仍然奇怪地减少了几毫秒),所以看起来 SQLite 确实忽略了我们的索引,除非我们强制它.

我还尝试了其他一些方法,看看它们是否会有所作为,但它们没有:

  • 显式地按照此处DESC描述的方式创建索引,无论有无INDEXED BY
  • 在索引中显式添加id列,有和没有internaldate_time_t排序DESC,有和没有INDEXED BY
  • 可能还有其他几件事我现在不记得了

问题

这里的 100 毫秒似乎仍然非常慢,因为它看起来应该是一个简单的 FTS 查找和索引顺序。

  • 这里发生了什么?除非你强迫它,否则它为什么会忽略明显的索引?
  • 我在合并虚拟表和常规表中的数据时遇到了一些限制吗?
  • 为什么它仍然相对较慢,我还能做些什么来让 FTS 匹配按另一个表中的字段排序?

谢谢!

0 投票
2 回答
58 浏览

android - 如何将显示的建议文本转换为匹配的单词

我不知道我的问题写得好不好,很抱歉,但这就是我需要的。

我有一个带有搜索活动的 Android 应用程序和我自己的建议字典。

当我显示建议时,我在第一行使用项目的名称,在第二行使用项目的描述。

问题是第二行中只有几个单词的空间,并且它从一开始就显示了描述。我想移动第二行文本以显示匹配的单词以及接下来会发生什么。

我希望它像谷歌一样工作。当它向您显示结果时,它会显示页面标题和第二个文本字段,其中包含您的单词所在的相关文本。

例如,如果我有这样的数据库:

和用户类型"my"我想显示我的建议是这样的:

我将 SQLite DB 与 Content Provider 和 SearchWidget 一起使用。

怎么做到呢?

0 投票
1 回答
987 浏览

sqlite - SQLite 正则表和 fts 表

我有表新闻(id、news_id、news_title)并创建 FTS 表:

我使用触发器使表 NEWS 和 news_search 保持同步:

问题:如何使用搜索?当我在 news_search 表中执行 MATCH 时,它只返回该表中的记录,但我需要新闻表中的 *news_id*。可能我应该将 *news_id* 列添加到news_search表吗?

在 sqlite 中使用 fts 的正确方法是什么?

0 投票
1 回答
435 浏览

ios - iOS 联系人搜索应用

我正在开发一个类似于 iOS 联系人应用程序的应用程序。在我的应用程序中,列表中大约有 20000 个联系人。我想在这个应用程序中执行通用搜索。当我们在搜索字段中输入时,搜索也应该发生

, 搜索“John Australia”将在名字字段中显示 John 所在的联系人,在地址字段中显示澳大利亚。我使用了 coredata,但它的性能很差(我不知道可能是我使用的谓词不正确,我使用了 OR 和 AND 组合的谓词)。

所以现在我转移到 sqlite FTS4 数据库并使用 FMDB 搜索联系人。性能比核心数据好得多。

这是我对 FTS4 所做的

将所有联系人导入 coredata 文件(uniqID、姓名、年龄、电子邮件、公司、职务、地址、备注)。现在用 uniqID ,searchText,displayName 创建了一个 fts4 虚拟表

并将所有字段插入 fts4 表。即,例如,

这是核心数据中的行,它像这样移动到 FTS4 表

现在我正在这个 sqlite fts 4 table 中执行搜索。这是我对“John Australia”的 SQL 查询

如果我有 3 个单词,那么我将有 intersection 3 select query 。我从此查询中得到的输出运行良好。

从查询中获得结果后,我使用显示名称填充 tableview

我有 2 个问题。

1 如果我有多个单词,与 iOS 原生联系人应用程序相比,我仍然面临性能问题。

  1. 如果我只搜索一个词,性能非常好,但对多词搜索不满意。

  2. 我的查询不会用 like 搜索电子邮件 ID(也就是说,即使我用工作“sock”进行搜索,我也需要得到结果)。

是否有任何算法或逻辑可以在此搜索中应用,以便我的搜索快速(请考虑多字搜索)。同时,我如何使用类似查询来搜索电子邮件 ID,以保持相同的更好性能

参考:http ://www.sqlite.org/fts3.html

http://www.swwritings.com/post/2013-04-30-searching-for-speedy-searching