Как выполнить параметризованный запрос на CouchDB - PullRequest
17 голосов
/ 30 июля 2009

Я хотел бы использовать 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?key="hello"

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

http://localhost:5984/test/_design/search/_view/search_view?term="hello мир "

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

Ответы [ 2 ]

19 голосов
/ 30 июля 2009

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

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

2 голосов
/ 01 августа 2009

Технически это возможно, если вы выдаете для каждого документа каждый набор 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" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} это выдает:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...