Как выполнить параметризованный запрос на CouchDB
-
05-07-2019 - |
Вопрос
Я хотел бы использовать CouchDB для хранения некоторых данных для себя, а затем использовать RESTful API-вызовы для получения нужных мне данных. Моя база данных называется «тест» и все мои документы имеют похожую структуру и выглядят примерно так (где hello_world - это идентификатор документа):
"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"}
Я хотел бы, чтобы мои пользователи отправляли запрос, например: " предоставьте мне все документы, например, со словами "привет мир". Я поигрался с представлениями, но похоже, что они позволят мне переместить только одно или несколько из этих значений в «ключ». часть функции карты. Это дает мне возможность сделать что-то вроде этого:
http: // localhost: 5984 / test / _design / search / _view / search_view ключ = & Quot;? Привет & Quot; р>
Но это не позволяет мне разрешать пользователям указывать строку запроса. Например, что если они искали «Привет, мир»? Мне нужно было бы сделать два запроса: один для «Привет» и один для "мира" тогда я должен был бы написать связку javascript, чтобы объединить результаты, удалить дубликаты, и т. д. (YUCK!). Что я действительно хочу, так это уметь делать что-то вроде этого:
http: // localhost: 5984 / test / _design / search / _view / search_view? term = " привет мир "
Затем используйте параметр " здравствуй, мир " в функциях представления / уменьшения, чтобы найти все документы, которые содержат оба слова "привет" и "мир" в массиве тегов. Это возможно даже с CouchDB? Есть ли другой способ сделать это внутри представления, о котором я не думаю?
Решение
Представления CouchDB не поддерживают фасетный поиск, полнотекстовый поиск или пересечение результатов. Плагин couchdb-lucene позволяет вам делать все эти вещи.
Другие советы
Технически это возможно, если для каждого документа выдается каждый набор powerset тегов документа в качестве ключа. Элемент набора ключей должен быть упорядочен, и ваш запрос должен также запрашивать упорядоченные теги.
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 " : {"идентификатор": 123, "теги": ["привет", "мир"], "текст": " Hello World "}
это будет выдавать:
{ key: [], doc: ... }
{ key: ['hello'], doc: ... }
{ key: ['world'], doc: ... }
{ key: ['hello', 'world'], doc: ... }
Хотя возможно ли это, я бы посчитал это довольно неудобным решением. Я не хочу представить использование диска представлением для большего количества тегов. Я ожидаю, что количество выпущенных ключей вырастет до 2 ^ n.