В MongoDB , учитывая оператор find (), который возвращает курсор для набора строк, каков идиоматический и эффективный по времени способ возврата «контекстных» строк, т. е. строк последовательно до и / или после каждой строки в наборе?
Для меня самый простой способ объяснить эту концепцию - использовать ack , который поддерживает контекстный поиск. Для файла:
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
Это результат команды ack:
C:\temp>ack.pl -C 2 "line 4" test.txt
line 2
line 3
line 4
line 5
line 6
Я храню данные журнала в коллекции MongoDB, по одному документу на строку. Каждый журнал токенизируется на ключевые слова, и эти ключевые слова индексируются, что дает мне дешевый полнотекстовый поиск.
Я выполняю стандарт болота:
collection.find({keywords: {'$all': ['key1', 'key2']}}, {}).sort({datetime: -1});
и получаю курсор.На этом этапе, без добавления каких-либо дополнительных полей, каков подход к получению контекста? Я думаю, что поток выглядит примерно так:
Для набора результатов с R строками требуется 2R + 1 запросов.
Однако я думаю, что могу обменять пространство на время. Есть ли реальная альтернатива обновлению каждой строки ее context _id в фоновом режиме? Для данной строки, в которой в настоящее время есть поля:
_id, contents, keywords
, я бы добавил дополнительное поле:
_id, contents, keywords, context_ids
, а затем в последующем поиске я мог бы каким-то образом использовать эти context_ids, я думаю? Я еще совсем не знаком с MongoDB MapReduce, но может ли это проявиться в картине?
Я думаю, что наиболее прямой подход - сохранить полный текст фактических строк контекста в каждой строке, но это кажется немного грубо для меня. Явным преимуществом является то, что один запрос может вернуть нужный мне контекст.
Я ценю любые ответы, которые принимают объем вопроса. Я понимаю, что могу использовать Lucene или настоящую полнотекстовую поисковую систему вне диапазона, но я пытаюсь почувствовать грани и возможности MongoDB, поэтому я был бы признателен за ответы, специфичные для MongoDB. Спасибо!