【问题标题】:Storing an Inverted index in mysql在mysql中存储倒排索引
【发布时间】:2012-10-27 12:26:27
【问题描述】:

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

第一

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 不是一个选项

【问题讨论】:

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


    【解决方案1】:

    正确的表格设计取决于您计划如何使用数据。如果您打算使用像 "doc2[locations],doc5[locations],doc12[locations]" 这样的字符串 按原样 -- 无需任何进一步的后处理,那么您的 First 设计就可以了。

    但是,如果 - 正如您的问题所暗示的那样 - 您有时可能希望将 doc2[locations]doc5[locations] 等视为单独的实体,那么您绝对应该使用您的 Second 设计。

    这里有一些用例说明了为什么Second 设计更好:

    • 如果您使用First 并使用termID = a 询问所有文档,那么您 取回一个字符串 doc2[locations],doc5[locations],doc12[locations] 你然后 必须分开。

      如果您使用 Second,您会将每个文档作为单独的行。没有分裂!

      Second 结构更方便。

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

      如果您使用Second 设计,更新很容易:

      UPDATE table SET docId = "newdoc5[locations]" where docId = "doc5[locations]"
      

    【讨论】:

    • 如果条款是数百万,数百万行怎么办?
    • 我认为数百万行不会对常见的现代硬件造成任何问题。
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多