Сортировка представлений CouchDB значением

Я проверяю CouchDB, чтобы видеть, как он мог обработать вход некоторых результатов поиска. То, что я хотел бы сделать, является продуктом представление, где я могу произвести главные запросы из результатов. В данный момент у меня есть что-то вроде этого:

Часть документа в качестве примера

{
  "query": "+dangerous +dogs",
  "hits": "123"
}

Функция карты (Не точно, в чем я нуждаюсь/хочу, но это достаточно хорошо для тестирования),

function(doc) {
  if (doc.query) {
    var split = doc.query.split(" ");
    for (var i in split) {
      emit(split[i], 1);
    }
  }
}

Уменьшите функцию

function (key, values, rereduce) {
  return sum(values);
}

Теперь это получит меня результаты в формате, где термин запроса является ключом и счетом для того термина справа, который является большим. Но я хотел бы заказанный значением, не ключом. От звуков его это еще не возможно с CouchDB.

У кого-либо есть какие-либо идеи того, как я могу получить представление, где у меня есть заказанная версия условий запроса и их связанных количеств? Я очень плохо знаком с CouchDB, и я просто не могу думать, как я записал бы необходимые функции.

37
задан Lee Theobald 12 May 2010 в 10:00
поделиться

3 ответа

Это правда, что нет однозначного ответа. Однако есть несколько закономерностей.

  1. http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags. Мне лично это не нравится, потому что они признают, что это хрупкое решение, и код не выглядит расслабляющим.

  2. Ответ Ави, который заключается в сортировке in-memory в вашем приложении.

  3. couchdb-lucene, который, похоже, в конечном итоге нужен всем!

  4. Что мне нравится, так это то, что Крис сказал в цитате Ави. Расслабьтесь. В CouchDB базы данных легковесны и прекрасно справляются с задачей дать вам уникальную перспективу ваших данных. В наши дни все говорят о фильтрованной репликации, которая заключается в выделении подмножеств ваших данных для размещения в отдельной БД.

    В любом случае, основы просты. Вы берете ваши .rows из вывода представления и вставляете их в отдельную БД, которая просто выдает ключ по счету. Дополнительным приемом является написание очень простой функции _list. Списки "преобразуют" необработанный вывод couch в различные форматы. Ваша функция _list должна выводить

    {"docs":
     [ {...view row1..,}
     {...view row2...},
     {...etc...}
     ]
    }
    

    Это позволит отформатировать вывод представления именно так, как того требует _bulk_docs API. Теперь вы можете направить curl непосредственно в другой curl:

    curl host:5984/db/_design/myapp/_list/bulkdocs_formatter/query_popularity \
     | curl -X POST host:5984/popularity_sorter/_design/myapp/_view/by_count
    
  5. На самом деле, если ваша функция списка может обрабатывать все документы, вы можете просто заставить ее сортировать их самостоятельно и возвращать клиенту отсортированными.

24
ответ дан 27 November 2019 в 04:56
поделиться

Я не уверен насчет числа 1 в качестве возвращаемого результата, но уверен, что это должно помочь:

emit ([doc.hits, split [i]], 1);

Правила сортировки определены в документации.

2
ответ дан 27 November 2019 в 04:56
поделиться

Этот появился в списке рассылки пользователей CouchDB, и Крис Андерсон, один из основных разработчиков, написал:

Это обычный запрос, но он не поддерживается напрямую CouchDB {{1 }} представления - для этого вам нужно скопировать запрос на сокращение группы в другую базу данных и построить представление для сортировки по значению.

Это компромисс, который мы делаем в пользу запросов с динамическим диапазоном и инкрементных индексов.

Мне тоже нужно было сделать это недавно, и в итоге я сделал это на уровне своего приложения. Это легко сделать в JavaScript:

db.view('mydesigndoc', 'myview', {'group':true}, function(err, data) {

    if (err) throw new Error(JSON.stringify(err));

    data.rows.sort(function(a, b) {
        return a.value - b.value;
    });

    data.rows.reverse(); // optional, depending on your needs

    // do something with the data…
});

Этот пример работает в Node.js и использует node-couchdb , но его можно легко адаптировать для работы в браузере или другом JavaScript. среда. И, конечно же, концепция переносима на любой язык / среду программирования.

HTH!

13
ответ дан 27 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: