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?

Foi útil?

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.

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top