在mysql中存储反向索引

时间:2012-10-27 12:26:27

标签: python mysql database database-design inverted-index

我正在努力创建一个非常大的倒排索引术语。你会建议什么方法?

第一

termId - > docId
  a        doc2[locations],doc5[locations],doc12[locations] 
  b        doc5[locations],doc7[locations],doc4[locations] 

第二

termId - > docId
  a        doc2[locations]
  a        doc5[locations]
  a        doc12[locations]
  b        doc5[locations]
  b        doc7[locations] 
  b        doc4[locations]  

p.s Lucene不是一个选项

1 个答案:

答案 0 :(得分:1)

正确的表格设计取决于您计划如何使用数据。如果您计划使用"doc2[locations],doc5[locations],doc12[locations]" 之类的字符串而不进行任何进一步的后处理,那么您的First设计就可以了。

但如果 - 正如您的问题默认建议 - 您有时可能会将doc2[locations]doc5[locations]等视为单独的实体,那么您一定要使用{{1}设计。

以下是一些用例,说明Second设计更好的原因:

  • 如果您使用Second并要求所有文档First,那么您 得到一个字符串 你那么termID = a 不得不拆分。

    如果使用Second,则将每个doc作为单独的行。没有分裂!

    doc2[locations],doc5[locations],doc12[locations]结构更方便。

  • 或者,假设某些时候Second发生了变化,您需要这样做 更新你的表。如果您使用doc5[locations]设计,则必须使用 一些相对复杂的MySQL string function来查找和替换包含它的所有行中的子字符串。 (请注意,MySQL没有内置regex substitution。)

    如果您使用First设计,则更新很简单:

    Second