我用150k字和定义开发了一个法语简单的词典应用程序。 我正在寻找最佳方法。
首先我使用带有150k字的sqlite bdd。 我使用LIKE命令进行单词搜索,但速度非常慢 例如:SELECT * FROM words WHERE word LIKE'%avoi%'LIMIT 0,50; 搜索包含'avoi'的单词,如'avoir'或'savoir'。 我的表有列索引,但是LIKE没有使用索引,因此它在3GS上非常慢(2-5)。
我使用fts3扩展关闭sqlite后使用MATCH命令 例如:SELECT * FROM words WHERE单词匹配'avoi *'LIMIT 0,50; 在3GS上要好得多(0,1-0,15s),但只搜索以“躲避”字样开头的单词“savoir”不在结果中。 MATCH命令不适用于' avoi '
等语法您对优化此文本搜索有任何想法吗?
我有一个非常好的iphone应用程序例子:Dixel(Robert Disctionnary)非常快速地进行这种搜索。对方法有什么想法?
感谢您的回答。
答案 0 :(得分:2)
快速词典使用复杂的数据结构来限制暴力搜索。关于可以快速存储和搜索的单词的数据很多
一个这样的数据结构只是基于它们包含的字母之间关系的单词排序。例如。您有一个表格,列出a
后跟v
的所有单词。然后是另一个包含v
后跟o
的所有单词。搜索任意字符串avo
然后成为合并表与序列AND的问题。所以:
(all words in which `a` is followed by a `v`) AND (all words in which `v` followed by an `o`)
一旦你得到匹配的所有单词的表格都有必要的模式,你就可以快速强制它。
字典就像日期和时代一样,它们看起来很简单,因为我们已经习惯了它们,但在幕后使用它们在计算机上工作所需的代码看似复杂。