Хранение инвертированного индекса в MySQL
Я работаю над созданием очень больших перевернутых индексов. Какой метод вы бы предложили?
Первый
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]
PS Lucene не вариант
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, чтобы найти и заменить подстроку во всех строках, которые ее содержат. (Обратите внимание, что MySQL не поставляется со встроенной заменой регулярных выражений.)Если вы используете
Second
дизайн, обновление легко:UPDATE table SET docId = "newdoc5[locations]" where docId = "doc5[locations]"