Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在CouchDB上执行参数化查询_Couchdb - Fatal编程技术网

如何在CouchDB上执行参数化查询

如何在CouchDB上执行参数化查询,couchdb,Couchdb,我想使用CouchDB为我存储一些数据,然后使用RESTful api调用来获取我需要的数据。我的数据库称为“test”,我的文档都有类似的结构,看起来像这样(其中hello_world是文档ID): 我希望能够让我的用户发送一个查询,例如:“给我所有包含单词‘hello world’的文档。我一直在使用视图,但它们似乎只允许我将一个或多个值移动到”键中“映射函数的一部分。这让我有能力做这样的事情: “你好” 但这不允许我的用户指定他们的查询字符串。例如,如果他们搜索“hello world”该

我想使用CouchDB为我存储一些数据,然后使用RESTful api调用来获取我需要的数据。我的数据库称为“test”,我的文档都有类似的结构,看起来像这样(其中hello_world是文档ID):

我希望能够让我的用户发送一个查询,例如:“给我所有包含单词‘hello world’的文档。我一直在使用视图,但它们似乎只允许我将一个或多个值移动到”键中“映射函数的一部分。这让我有能力做这样的事情:

“你好”

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

“你好,世界”


然后在视图映射/减少函数中使用参数“hello world”查找标记数组中同时包含“hello”和“world”的所有文档。这种事情在CouchDB中可能发生吗?在我没有想到的视图中,还有其他方法可以实现这一点吗?

CouchDB视图不支持分面搜索、全文搜索或结果交集。couchdb lucene插件允许您完成所有这些事情


从技术上讲,如果您为每个文档发出文档标记的每一组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);
  }
}
对于doc
{“hello_world”:{“id”:123,“tags”:[“hello”,“world”],“text”:“hello world”}
这将发出:

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

虽然这是可能的,但我认为这是一个相当的ARKWD解决方案。我不想想象更多的标签的磁盘使用情况。我希望发出的密钥的数量增长到2 ^ n。/P>< P>引擎盖下,CouCHDB通过B-树来存储数据,因此你应该使用视图进行预处理,这种情况下的限制就是你能做到的。不搜索正则表达式。或者,您可以从视图中的键中通过前缀或后缀进行搜索

注意:不要使用emit(key,doc),它会克隆文档,您应该使用emit(key,null)或emit(key),并在查询时添加“include_docs=true”

您可以使用您的标记作为查询键

//视图功能

function (doc) {
  if (doc.type === "hello") {
    emit(doc);
  }
}
//芒果查询

db
.query(your_view_name,
      { startkey: startkey, endkey: endkey, include_docs: true });
注:


另外:如果你不想让性能陷入地狱,千万不要使用mango query来查询正则表达式,sences。我通过查看功能将性能问题从2分钟改为2秒。

想详细说明或提供示例吗?他是该项目的开发人员之一—“你做不到,但这个项目会让你做到。”这是一个非常好的答案。不建议这样做。性能将受到严重影响,正如您所提到的,索引的存储将变得失控。上面提到的couchdb lucene是实现他想要的功能的正确方法。
db
.query(your_view_name,
      { startkey: startkey, endkey: endkey, include_docs: true });
endkey = startkey + "\uffff";
startkey = "h", "he", "hell"...