Сортировка данных CouchDB с помощью couch-lucene - PullRequest
4 голосов
/ 27 марта 2012

У меня есть некоторые данные суммирования, которые было очень легко сгенерировать, используя некоторые относительно простые карты / уменьшенные представления.Но мы хотим отсортировать данные на основе сокращенного представления значения (а не ключей).Было предложено использовать couchdb-lucene для этого.Но как?Мне не понятно, как использовать полнотекстовый индекс для быстрого ранжирования данных такого типа.

То, что у нас уже есть

Упрощенное примерное представление выглядит примерно так:следующее:

by_sender: {
  map: "function(doc) { emit(doc.sender, 1); }",
  reduce: "function(keys, values, rereduce) { return sum(values); }"
}

, которое возвращает результаты, примерно такие, как следующие (при запуске с group=true):

 {"rows":[
 {"key":"a@example.com","value":2},
 {"key":"aaa@example.com","value":1},
 {"key":"aaap@example.com","value":34},
 {"key":"aabb@example.com","value":1},
 ... thousands or tens of thousands of rows ...
 ]}

Что мы хотим

Они отсортированы по ключу, но мне нужно отсортировать данные в соответствии со значениями, например:

 {"rows":[
 {"key":"xyzzy@example.com","value":847},
 {"key":"adam@example.com","value":345},
 {"key":"karl@example.com","value":99},
 {"key":"aaap@example.com","value":34},
 ... thousands or tens of thousands of rows ...
 ]}

И мне нужно отсортировать их так быстро, как это возможно (например, если это займет <100 мсдля обновления индексов не требуется 1 минуты, прежде чем новые данные будут отражены в запросах). </p>

Больше контекста: что мы уже пробовали

Лучший ответв Сортировка просмотров CouchDB по значению предоставляет четыре жизнеспособных варианта, которые мы пробовали в порядке возрастания сложности:

  1. Сначала мы отсортировали результаты на стороне клиента, но это было way слишком медленно.
  2. Далее мы создали список функцийпо которому сортирует данные.Немного быстрее, но все еще слишком медленно.
  3. Цепные представления с уменьшением карты должны легко решить эту проблему.
    • Кто-то указал на Цепные просмотры с уменьшением карты .Они не входят в BigCouch , но являются частью услуг Cloudant, которых, к сожалению, в настоящее время нет в нашем бюджете.
    • Я начал реализацию уровня приложения с помощью API _bulk_docs.Это сложно, если вы хотите сохранить обновления как можно более быстрыми, избегая условий гонки и т. Д. Я могу продолжить этот подход, но это не расслабляет.: (
  4. В ответе предлагается использовать couchdb-lucene . Но я не достаточно знаком с полнотекстовым поиском, чтобы понять, как заставить его что-либо делатьболее сложный, чем индексировать документ и возвращать результат поиска. Я даже не знаю, с чего начать.

1 Ответ

0 голосов
/ 18 августа 2014

У меня была похожая проблема.Необходимо подсчитать количество голосов в каждой статье и отсортировать статьи по количеству голосов.Я решил использовать отдельный документ для отслеживания каждого голоса и другой документ, в котором хранится количество голосов на статью.Назовем их: статья, голосование, оценка.Я написал скрипт cron, который обновляет счет для каждой статьи, подсчитывая «незарегистрированные» голоса.Скрипт вызывает представление, используя функцию _count Reduce, где выдаются только «незарегистрированные» голоса (зарегистрирован == ЛОЖЬ).Я использую опцию group_results, чтобы получить количество незарегистрированных голосов на статью, затем я обновляю счет для каждой статьи, отмечая «зарегистрированные» голоса.На данный момент у меня есть точка зрения, согласно которой в качестве ключевой оценки каждой статьи и в качестве значения идентификатора статьи.Таким образом, статьи могут быть заказаны по счету.Конфликты можно избежать, используя эту технику.

...