2009-07-29 36 views
17

参数化查询我想用的CouchDB来存储我一些数据,然后使用REST的API调用来得到我需要的数据。我的数据库名为“测试”和我的文档都有着类似的结构,看起来像这样(其中程序hello_world是文档ID):如何执行对CouchDB的

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} 
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

我想什么,能够做的是有我的用户发送一个查询,例如:“给我所有包含'hello world'这些单词的文档,我一直在玩弄意见,但它看起来像只允许我将一个或多个这些值移动到。该地图功能的“重点”部分也练就了我做这样的事情的能力:

http://localhost:5984/test/_design/search/_view/search_view?key=“你好”

但是这不允许我让我的用户指定他们的查询字符串。例如,如果他们搜索“hello world”,该怎么办?我必须做两个查询:一个用于“hello”和一个用于“world”,然后我必须编写一堆javascript来结合结果,删除重复项等(YUCK!)。我真正想要的是能够做这样的事情:

http://localhost:5984/test/_design/search/_view/search_view?term=的“Hello World”

然后在视图地图使用参数的“Hello World” /缩小功能,找到所有的在tags数组中包含“hello”和“world”的文档。用CouchDB甚至可以做到这种事情吗?有没有另一种方法可以在我没有想到的观点中实现这一点?

回答

19

CouchDB视图不支持多面搜索或全文搜索或结果交集。 couchdb-lucene插件可以让你做所有这些事情。

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

+0

有意详细说明或提供示例? – 2009-07-29 21:29:19

+6

他是该项目的开发人员之一 - “你做不到,但这个项目会让你。”这是一个很好的答案。 – dnolen 2009-07-30 15:17:54

2

从技术上讲,如果你发出的每一个文件每套文档作为关键的变量的幂的,这是可能的。密钥集元素必须订购,您的查询也必须查询订购的标签。

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: ... } 

虽然这是可能的我会认为这是一个相当arkward解决方案。我不想把大量标签视为磁盘使用情况。我期望发射的密钥数量增长为2^n。