Como faço para executar uma consulta parametrizada no CouchDB
-
05-07-2019 - |
Pergunta
Eu gostaria de usar CouchDB para armazenar alguns dados para mim e, em seguida, usar chamadas API RESTful para obter os dados de que preciso. Meu banco de dados é chamado de "teste" e os meus documentos, todos têm uma estrutura e olhar algo semelhante como esta (onde hello_world é o ID do documento):
"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"}
O que eu gostaria de ser capaz de fazer é ter meus usuários enviar uma consulta, tais como:. "Dê-me todos os documentos que contêm as palavras 'Olá mundo', por exemplo, eu fui brincar com vistas mas parece que eles só me permite mover um ou mais desses valores para a parte "chave" da função de mapa que me dá a capacidade de fazer algo parecido com isto:.
http: // localhost: 5984 / test / _design / search / _view / search_view? key = "Olá"
Mas isso não me permite deixar meus usuários especificar a sua cadeia de consulta. Por exemplo, o que se procurou "Olá mundo". Eu teria que fazer duas consultas: uma para "Olá" e outra para "mundo" então eu teria que escrever um monte de javascript para combinar os resultados, duplicatas remover, etc (eca!). O que eu realmente quero é ser capaz de fazer algo parecido com isto:
http: // localhost: 5984 / test / _design / search / _view / search_view? term = "Olá mundo"
Em seguida, use o parâmetro "Olá mundo" nas vistas map / reduce funções para encontrar todos os documentos que contenham tanto "Olá" e "mundo" na matriz tags. É este tipo de coisa mesmo possível com o CouchDB? Existe outra maneira de conseguir isso dentro de uma visão que eu não estou pensando?
Solução
CouchDB Visualizações não suportam busca facetado ou pesquisa ou resultado de texto completo cruzamento. O plugin couchdb-Lucene permite fazer todas essas coisas.
Outras dicas
Tecnicamente isso é possível se você emite para cada documento de cada conjunto da powerset das tags do documento como a chave. O elemento-chave set devem ser encomendados e sua consulta Whould tenho que consultar as tags ordenou também.
function map(doc) {
function powerset(array) { ... }
powerset_of_tags = powerset(doc.tags)
for(i in powerset_of_tags) {
emit(powerset_of_tags[i], doc);
}
}
para o {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}
doc este emitiria:
{ key: [], doc: ... }
{ key: ['hello'], doc: ... }
{ key: ['world'], doc: ... }
{ key: ['hello', 'world'], doc: ... }
Embora isso é possível eu consideraria isso uma solução bastante arkward. Eu não quero imaginar o uso do disco da vista para um maior número de tags. Espero que o número de chaves emitidos a crescer como 2 ^ n.