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

StackOverflow https://stackoverflow.com/questions/1203071

  •  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 позволяет вам делать все эти вещи.

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

Другие советы

Технически это возможно, если для каждого документа выдается каждый набор 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.

scroll top