FTS优于定制解决方案的优势是什么?

时间:2013-11-22 12:59:47

标签: android sqlite full-text-search arabic

我有一个很大的数据库~32mb,有4种语言的大量文本。包括阿拉伯语和乌尔都语。我需要以最有效的方式(速度和尺寸)搜索此文本。

我正在考虑FTS,并试图找出如何实现它。现在我正在阅读http://www.sqlite.org/fts3.html#section_1_2

在我看来,FTS表就像用于索引所有不同单词的普通表一样。所以我的问题是:

1)如果要填充FTS我必须自己完成所有插入,那么为什么不制作我自己的索引字表,有什么区别?

答案:是的,它有许多优点,许多内置功能都有帮助。例如,对于排名等,搜索词干以及它在android中如何工作的透明性使得FTS方法更具吸引力。

2)在google docs上我读了一个虚拟的内存表,现在这将是非常正确的...但它并没有在SQLite网站上提到这一点。那是什么?

3)是否有一种简单的方法可以从我的列中生成所有不同的单词?

4)FTS能否妥善处理阿拉伯语单词?

2 个答案:

答案 0 :(得分:1)

  1. FTS允许快速搜索单词;普通索引仅允许搜索整个值或值的开头。 如果你的表在每个字段中只有一个单词,那么使用FTS是没有意义的。
  2. FTS是一个虚拟表,但不是内存表。
  3. 您可以使用fts4aux table
  4. 从全文索引中获取单个字词
  5. 默认tokenizer仅适用于ASCII文本。 您必须测试ICU或UNICODE61标记器是否可以处理您的数据。

答案 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作为其一部分的实现   实施