题
我想用CouchDB储存的一些数据对于我,然后使用的宁静api呼吁获得的数据,我需要。我的数据库是称为"测试"与我的文档都有一个相似的结构和看起来像这样的东西(在hello-world文件是文件ID):
"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"。我必须做的两个查询:一个"你好"和一个"世界"然后我必须要写一堆javascript结合的结果,删除重复等(呸!).我真正想要的是能够做到的事情是这样的:
http://localhost:5984/test/_design/search/_view/search_view?term="hello world"
然后使用的参数"你好世界"的视线图/降低职能找到的所有文件,包含这两个"你好"和"世界"的标签阵列。是这类的事情甚至可能CouchDB?是否有另一种方式来完成这一内部一个看法,即我不在想什么?
解决方案
CouchDB意见不支持面的搜索或全文搜索的或结果的交叉点。Couchdb-分类:设插件可以让你做所有这些事情。
其他提示
从技术上讲,这是可能的,如果你发出的每个文件每组又收购了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: ... }
虽然这是可能的,我会考虑这一个相当arkward的解决方案。我不想想象一下磁盘的使用视为一个较大数量的标签。我期望数量的发射钥匙增长2^正。