从句子中存储有趣的单词

时间:2011-04-11 20:26:51

标签: python sql sqlite

我有一个像the cat sat on the mat这样的句子存储为单个sql字段。我想定期搜索不在停止列表中的关键字,在这种情况下cat sat mat将它们存储在SQL表中以便快速搜索的最佳方法是什么?

据我所见,我看到以下选项

  1. 每行最多[n]个附加列,每个单词一列。
  2. 将所有有趣的单词存储在一个逗号分隔的字段中。
  3. 一个新表,使用上述任一选项链接到第一个表。
  4. 每次有新词搜索时都不做任何事情并搜索匹配项。
  5. 哪种是最佳做法,哪种搜索字匹配最快?我在python中使用sqlite,如果这有所不同。

3 个答案:

答案 0 :(得分:1)

我建议给你的句子一个关键,可能是IDENTITY。然后我会创建一个链接到你的句子表的第二个表,每个有趣的单词都有一行。

如果您想搜索以ca开头的单词,如果您将这些单词存储在逗号分隔中,则必须使用通配符开头和结尾,而如果它们各自位于单独的行中,则可以绕过开头的通配符。

另外,假设您找到一个匹配项,在逗号分隔的列表中,您必须解析出哪个单词实际上是一个匹配。使用第二个表,您只需返回单词本身。更不用说在一个字段中存储多个值是关系数据库中的主要禁忌。

答案 1 :(得分:1)

您最好的选择可能是进行全文搜索。

这些问题FULL-TEXT Search in SQLiteSQLite full text search catalog有望让您朝着正确的方向前进。

答案 2 :(得分:1)

我也和SQLite做类似的事情。根据我的经验,在这种情况下它并不像其他数据库那么快,因此让你的模式尽可能简单是值得的。

  • 每行最多[n]个附加列,每个单词一列。
  • 将所有有趣的单词存储在一个逗号分隔的字段中。
  • 一个新表,使用上述任一选项链接到第一个表。
  • 每次有新词搜索时都不做任何事情并搜索匹配。

如果您希望使用LIKE进行缩放和匹配,则在4个选项中,2)和4)可能太慢。尽管如此,使用全文匹配更快,因此值得研究。 1)看起来是糟糕的数据库设计,如果有更多的单词而不是列?如果没有那么多,那只是浪费空间。 3)是最好的IMO,如果你把单词作为自己表中的主键,搜索速度应该是可接受的快。