Подтвердить что ты не робот

Как выполнить параметризованный запрос на CouchDB

Я хотел бы использовать CouchDB для хранения некоторых данных для меня, а затем использовать вызовы RESTful api для получения необходимых мне данных. Моя база данных называется "test", и мои документы имеют сходную структуру и выглядят примерно так (где hello_world - это идентификатор документа):

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

Я хочу, чтобы мои пользователи отправили запрос, например: "Дайте мне все документы, содержащие слова" hello world ", например. Я играл с просмотрами, но похоже, что они позволят мне переместить одно или несколько из этих значений в" ключевую" часть функции карты. Это дает мне возможность сделать что-то вроде этого:

http://localhost:5984/test/_design/search/_view/search_view?key= "hello"

Но это не позволяет мне указывать свою строку запроса. Например, что, если они искали "привет мир". Я должен был бы выполнить два запроса: один для "привет" и один для "мира", тогда мне пришлось бы написать кучу javascript, чтобы объединить результаты, удалить дубликаты и т.д. (YUCK!). Я действительно хочу, чтобы иметь возможность сделать что-то вроде этого:

http://localhost:5984/test/_design/search/_view/search_view?term= "hello world"

Затем используйте параметр "hello world" в представлении map/reduce функции, чтобы найти все документы, содержащие как "привет", так и "мир" в массиве тегов. Возможно ли это с CouchDB? Есть ли другой способ сделать это в представлении, о котором я не думаю?

4b9b3361

Ответ 1

CouchDB Views не поддерживают фасетный поиск или полнотекстовый поиск или пересечение результатов. Плагин couchdb-lucene позволяет вам делать все это.

http://github.com/rnewson/couchdb-lucene/tree/master

Ответ 2

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

function map(doc) {
  function powerset(array) { ... }

  powerset_of_tags = powerset(doc.tags)
  for(i in powerset_of_tags) {
    emit(powerset_of_tags[i], doc);
  }
}

для документа {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} это испустит:

{ key: [], doc: ... }
{ key: ['hello'], doc: ... }
{ key: ['world'], doc: ... }
{ key: ['hello', 'world'], doc: ... }

Хотя это возможно, я бы счел это довольно ущемленным решением. Я не хочу представлять себе использование диска для большого количества тегов. Я ожидаю, что количество испущенных ключей будет расти как 2 ^ n.