NoSQL: индексация и поиск по ключевым словам - PullRequest
4 голосов
/ 27 декабря 2011

У меня есть приложение, в котором хранятся элементы (например, веб-документы). Каждый элемент может содержать произвольно большой набор тегов. И типичным распространенным запросом является получение всех документов с заданным набором тегов. Ну, довольно распространенное веб-приложение.

Теперь я думаю о базе данных NoSQL как о постоянном хранилище. Различные системы NoSQL (например, MongoDB) поддерживают вторичные индексы и с этим поиском по ключевым словам. Примеры, показывающие, как это сделать в разных системах, легко найти. Проблема в том, что я хотел бы знать, что происходит "под капотом", то есть как / где хранятся вторичные индексы и как на самом деле выполняется запрос со списком тегов. Особенно в системах с множеством узлов.

Мне известны решения на основе Map / Reduce или аналогичные. Но здесь меня интересует, как работает индексация. Например, у меня есть следующие вопросы:

  • Хранит ли вторичный индекс только идентификатор элемента / объекта или более?
  • Если запрос содержит k тегов, выполняются ли k подзапросов - по одному на каждый тег, и k частичных результатов объединяются в инициирующем узле?

Где я могу найти такую ​​информацию для разных систем NoSQL? Большое спасибо за любые подсказки.

Christian

1 Ответ

2 голосов
/ 27 декабря 2011

В MongoDB индекс по тэгам будет выполняться с использованием функции многоключевого режима, благодаря которой база данных пытается сопоставить документы с каждым элементом массива.Вы могли бы проиндексировать этот атрибут тегов данного документа, который бы создал btree, созданный из диапазонов тегов в этом массиве.

Вы можете узнать больше о мультиключах здесь и получить большеинформация об индексировании в MongoDB при просмотре этой презентации: MongoDB Internals

Хранит ли вторичный индекс только идентификатор элемента / объекта или более?

Индексы состоят из индексированного поля (допустим, в вашем случае это массив тегов, тогда поле будет одним тегом) и смещения, используемого для эффективного размещения документа в памяти.Он также имеет некоторые отступы + другие издержки, как описано здесь

Если запрос содержит k тегов, выполняется ли k подзапросов - по одному для каждого тега, и k частичных результатов объединяютсяодин инициирующий узел?

Это зависит, но если, например, запрос использовал $ или поле тега, я думаю, что запросы выполняются параллельно, каждый в O (log n)время, и результаты объединяются в набор результатов, но я не уверен в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...