问题标签 [fts3]
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.
sqlite - SQLite FTS3 中的中文分词器在哪里?
我正在使用 SQLite-FTS3 进行多语言搜索。
似乎没有中文或韩文的标记器。
如何在 FTS3 中使用中文和韩文进行搜索?
android - 如何使用 ndk 在 android 中使用 sqlite3_create_function
好的,所以我成功地能够使用 android NDK 和我用于 sqlite3_create_function 的代码构建 sqlite,但是当我尝试在游标查询中使用它时,它说没有函数。我在 Stackoverflow 上的其他地方听说这是因为 SQLite 的 Java 实现没有该功能,但 C 有。我该如何抵消这一点并使其发挥作用?使用该函数从 android sdk 重新编译 sqlite3 会更好还是不会有什么不同?这是我使用的 Android.mk 文件。
我用于 fts3-rank 的代码位于https://github.com/coolaj86/sqlite3-fts4-rank/blob/master/fts4-rank.c
我在查询中正确使用了 rank() 而不是 rankfunc()。我的 C 代码或 Activity 中的本机方法中也没有包含 JNI,因为当我不在 Activity 中调用该方法时,我看不出它有什么用处。我只需要在查询中使用它。是的,我做了 loadLibrary 并且没有在设备上收到该错误。网上没有关于如何做到这一点的指南,所以希望有人能回答。目的是在没有 Lucene 的情况下在 Android 中进行相关性排名(你甚至可以在 Android 中使用它吗?)。
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 匹配按另一个表中的字段排序?
谢谢!
sqlite - SQLite 3,FTS3 - 加入查询
我浏览了网上可用的文献,以了解互联网上可用的 SQLite 的各种 JOIN。但无法找出满足我要求的一个。
我需要根据各种类别执行过滤操作,最重要的是我需要从过滤的内容中执行搜索操作。
用户选择品牌 Nike 和 Item_type = SportShoes 用户获得 1000 个项目的结果集。现在他想通过“搜索”描述中的具体细节来进一步减少它们。
即我需要构建查询,首先过滤数据集并搜索该数据集中的特定文本(另一种选择,我可以编写简单的 JOIN 查询,它可以给我适当的结果,但我的邮件关注的是性能)。请建议可以产生良好性能的特定类型的 JOIN 查询。
android - 如何在 SQLite 中使用 FTS3
我有近 20 万个条目的表。当我尝试使用 LIKE 进行搜索时,速度非常慢。现在我决定使用 FTS。所以我创建了两个索引来进行搜索。然后我创建了 fts 虚拟表。
我不知道如何使用新创建的 FTS 表。所以我的问题是如何使用该虚拟表进行搜索?能给我举个例子吗?
android - Android 上的 SQLite 增强查询语法
我有以下 SQLite 查询,它在我的本地机器上运行良好:
这似乎在我的 Android 设备上返回的结果集与在我的桌面上返回的结果集不同。它在 Android 上返回的结果要少得多。此查询似乎在两者上都返回了正确的结果:
但是,理想情况下,我希望将 AND 和 OR 查询结合起来,而不是被迫使用 AND。
Android 不支持增强查询语法的某些功能吗?我在第一个实例中使用了不正确的语法吗?
database - 在 sqlite 中搜索虚拟表(FTS3)
我为在数据库中搜索文本创建了一个虚拟表。
这是单词,但是当我想搜索特殊 ID 时会变得很慢。
我也无法索引“id”字段并出现错误:
想这样搜索:
如何快速搜索此查询,我在没有 FTS 的情况下快速搜索。
ios - SQLCipher商业版和FTS3
FTS3
在添加 sqlite 合并作为静态库结束启用后,我已经在使用FTS3
(按照本教程http://longweekendmobile.com/2010/06/16/sqlite-full-text-search-for-iphone-ipadyour-own-sqlite -for-iphone-and-ipad/ )。
该应用程序正在搜索的数据库包含受版权保护的文本,所以我决定使用 SQLCypher 商业版本FTS3
,如果我没记错的话,它已经启用了。我在http://sqlcipher.net/support/之后添加了 SqlCipher 静态库,然后删除了之前添加的 sqlite 静态库,这是正确的吗?我应该只保留libsqlcipher.a
在我的项目中吗?
android - Sqlite FTS3 匹配或
我在一个 android 项目的 sqlite 中使用 FTS3。问题是当我搜索“或”这个词时,数据库期望更多的词。
这很好用,除非单词是“或”。
如何在数据库中搜索“或”这个词?
这是错误:
谢谢
android - 匹配 FTS 表中的 3 个或更多值
我有 2 个FTS表:search和search_eng。我正在尝试从search_eng获取匹配词的entry_id。然后我根据这些entry_id从搜索中获取值。但是当我尝试以下面显示的方式实现它时,它给出了错误:SQL logic error。这是因为MATCH ing 超过 2 个值?如果不是我做错了什么?
堆栈跟踪:
09-26 21:48:14.937: E/AndroidRuntime(29495): 致命异常: main 09-26 21:48:14.937: E/AndroidRuntime(29495): android.database.sqlite.SQLiteException: SQL 逻辑错误或缺少数据库09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.database.sqlite.SQLiteQuery.native_fill_window(Native Method) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.database .sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:73) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:299) 09-26 21 :48:14.937: E/AndroidRuntime(29495): 在 android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:272) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.support。 v4.widget.CursorAdapter.getCount(CursorAdapter.java:202) 09-26 21:48:14.937: E/AndroidRuntime(29495):在 android.widget.ListView.setAdapter(ListView.java:489) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 com.joericharduz.akita.MainActivity.displayListView(MainActivity.java:147) 09- 26 21:48:14.937: E/AndroidRuntime(29495): at com.joericharduz.akita.MainActivity.access$0(MainActivity.java:136) 09-26 21:48:14.937: E/AndroidRuntime(29495): at com .joericharduz.akita.MainActivity$1.onTextChanged(MainActivity.java:122) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.widget.TextView.sendOnTextChanged(TextView.java:6603) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.widget.TextView.handleTextChanged(TextView.java:6650) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.widget.TextView $ChangeWatcher.onTextChanged(TextView.java:6794) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:352) 09-26 21:48: 14.937: E/AndroidRuntime(29495): 在 android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.text.SpannableStringBuilder.replace(SpannableStringBuilder .java:432) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:409) 09-26 21:48:14.937: E/AndroidRuntime(29495 ): 在 android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:28) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:654) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:180) 09-26 21:48:14.937: E/AndroidRuntime(29495) : 在 com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:120) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper .java:283) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:79) 09-26 21:48:14.937 : E/AndroidRuntime(29495): 在 android.os.Handler.dispatchMessage(Handler.java:99) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 android.os.Looper.loop(Looper. java:130) 09-26 21:48:14.937: E/AndroidRuntime(29495):在 android.app.ActivityThread.main(ActivityThread.java:3687) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 java.lang.reflect.Method.invokeNative(Native Method) 09-26 21: 48:14.937: E/AndroidRuntime(29495): 在 java.lang.reflect.Method.invoke(Method.java:507) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal .os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 09-26 21:48:14.937: E/AndroidRuntime(29495): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 09-26 21:48:14.937: E/AndroidRuntime(29495): at dalvik.system.NativeStart.main(Native Method)reflect.Method.invoke(Method.java:507) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 09 -26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 09-26 21:48:14.937: E/AndroidRuntime(29495):在 dalvik.system.NativeStart.main(本机方法)reflect.Method.invoke(Method.java:507) 09-26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 09 -26 21:48:14.937: E/AndroidRuntime(29495): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 09-26 21:48:14.937: E/AndroidRuntime(29495):在 dalvik.system.NativeStart.main(本机方法)