【问题标题】:Storing interesting words from a sentence从句子中存储有趣的单词
【发布时间】:2011-04-11 20:26:50
【问题描述】:

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

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

  1. 每行最多有 [n] 列,每个单词一个列。
  2. 将所有有趣的单词存储在一个以逗号分隔的字段中。
  3. 一个新表,使用上述任一选项链接到第一个表。
  4. 每当我有一个新词要搜索时,什么都不做并搜索匹配项。

搜索词匹配的最佳做法和最快的做法是什么?如果有区别,我会在 python 中使用 sqlite。

【问题讨论】:

  • 我喜欢所有的答案。谢谢!

标签: python sql sqlite


【解决方案1】:

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

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

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

【讨论】:

  • 这会很好地扩展吗?我目前有大约 8 万个句子要拆分,而且很容易再多一个数量级。
  • 我们需要知道这些表将如何被使用。我没有看到任何缩放问题。当然,您的表格可能有几百万行,但根据您的搜索方式,这应该不是问题。如果您最终每次都使用 '%%' 进行搜索,那么完成这项工作并没有什么意义。
【解决方案2】:

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

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

【讨论】:

  • 看起来不错,但我可能需要模糊搜索。虽然不知道这存在
【解决方案3】:

我也用 SQLite 做类似的事情。以我的经验,在这种情况下它不如其他数据库快,所以让你的架构尽可能简单是值得的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多