我有一个很大的数据库~32mb,有4种语言的大量文本。包括阿拉伯语和乌尔都语。我需要以最有效的方式(速度和尺寸)搜索此文本。
我正在考虑FTS,并试图找出如何实现它。现在我正在阅读http://www.sqlite.org/fts3.html#section_1_2。
在我看来,FTS表就像用于索引所有不同单词的普通表一样。所以我的问题是:
1)如果要填充FTS我必须自己完成所有插入,那么为什么不制作我自己的索引字表,有什么区别?
答案:是的,它有许多优点,许多内置功能都有帮助。例如,对于排名等,搜索词干以及它在android中如何工作的透明性使得FTS方法更具吸引力。
2)在google docs上我读了一个虚拟的内存表,现在这将是非常正确的...但它并没有在SQLite网站上提到这一点。那是什么?
3)是否有一种简单的方法可以从我的列中生成所有不同的单词?
4)FTS能否妥善处理阿拉伯语单词?
答案 0 :(得分:1)
答案 1 :(得分:0)
1)如果填充FTS我必须自己完成所有插入,那么为什么 没有制作我自己的索引词表,有什么区别?
使用您自己的索引字表,您将在words
中解析sentences
。然后你需要一个表格用于句子而另一个用于单词。你应该有效地做到这一点。
2)在谷歌文档中,我读了一个虚拟的内存表,现在这个 将是非常正确的...但它没有在SQLite上提到这一点 网站。那是什么?
不明白你的问题。数据通过虚拟表扩展处理,但后备存储在数据库中完成(FTS4为每个虚拟表创建5个表)。检查一下:
sqlite> CREATE VIRTUAL TABLE docs USING fts4();
sqlite> .schema
CREATE VIRTUAL TABLE docs USING fts4();
CREATE TABLE 'docs_content'(docid INTEGER PRIMARY KEY, 'content');
CREATE TABLE 'docs_segments'(blockid INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE 'docs_segdir'(level INTEGER,idx INTEGER,start_block INTEGER,leaves_
end_block INTEGER,end_block INTEGER,root BLOB,PRIMARY KEY(level, idx));
CREATE TABLE 'docs_docsize'(docid INTEGER PRIMARY KEY, size BLOB);
CREATE TABLE 'docs_stat'(id INTEGER PRIMARY KEY, value BLOB);
sqlite>
3)有没有一种简单的方法来生成我的所有不同的单词 列?
当然可以。但这并不容易。这就是FTS所做的。
4)FTS能否妥善处理阿拉伯语单词?
我不确定。阿拉伯语言是否使用ICU字边界?来自Tokenizer:
ICU tokenizer实现非常简单。它分割输入 根据ICU规则查找单词边界和 丢弃任何完全由白色空间组成的令牌。这可能是 适用于某些语言环境中的某些应用程序,但不是全部。如果更多 需要复杂的处理,例如实现词干或 丢弃标点符号,这可以通过创建一个标记化器来完成 使用ICU tokenizer作为其一部分的实现 实施