【问题标题】:How to get Couchdb/Cloudant design document ready for search all fields?如何准备好 Couchdb/Cloudant 设计文档以搜索所有字段?
【发布时间】:2015-05-24 23:55:26
【问题描述】:

我有一个非常简单的数据库,其中包含一些存储在 Cloudant 中的数据模式。

{
  "_id": "units_modal_the_oaks_preliminary",
  "_rev": "1-b541013bc008680b706ea01969dedb7a",
  "type": "units_modal",
  "label": "Preliminary Modal",
  "notes": "Notes here...",
  "project": "the_oaks",
  "data": [...]
}

我将 Cloudant 与 PouchDB 连接起来。我的目标只是让这个数据库准备好被除数据之外的所有字段查询。

我使用 PouchDB-Find 来查询数据。我花了一整天的时间在文档上创建设计文档和视图,但我不知道如何正确地做到这一点。所有文件都建议使用 map 函数和 reduce 函数。我尝试了各种手动设计地图功能的方法,但是当我运行查询时

remoteDb.find({
    selector:{type:"units_modal"}
})

我收到“no_usable_index”错误。我只能使用 PouchDB-find 提供的方法来创建索引 & 然后我可以得到我想要的结果:

remoteDb.createIndex({
    index: {
        fields: ['type', 'project','label','notes']
    }
})

我查看了设计文档。这是我所拥有的(我已将 id 和视图重命名):

{
  "_id": "_design/project",
  "_rev": "8-c7e2b7c0e1dbaff8e5641a4f06075e14",
  "language": "query",
  "views": {
    "units_modal": {
      "map": {
        "fields": {
          "type": "asc",
          "project": "asc",
          "label": "asc",
          "notes": "asc"
        }
      },
      "reduce": "_count",
      "options": {
        "def": {
          "fields": [
            "type",
            "project",
            "label",
            "notes"
          ]
        },
        "w": 2
      }
    }
  }
}

所有这些都非常令人困惑。似乎除了地图功能外,我找不到任何东西来解释地图。这里的地图功能在哪里?关于 map.fields、views.options.def 和 views.options.w 的文档和说明在哪里?

有人可以提出一种简单的方法来设计可以轻松查询有关特定类型文档的所有字段的视图吗?

谁能推荐一个地方,让我可以得到更多关于 map.fields、view.options 和所有这些关于 CouchDB 的小东西的解释?

有没有简单的“if(type=='some type') indexAll();”解决办法?

非常感谢!

【问题讨论】:

    标签: couchdb pouchdb cloudant


    【解决方案1】:

    首先,很抱歉让您感到困惑。 Cloudant Query 是 Cloudant/CouchDB 中一个相对较新的功能,它实际上是对现有的较低级别的索引机制(map/reduce 和搜索)的包装。用户创建的 map/reduce 或 Cloudant Search 索引不能用于为 Cloudant Query 调用提供服务 - 它维护自己的索引。

    Cloudant Query 要求存在合适的索引来处理对 _find 的请求,因此您会收到错误消息。 Cloudant Query 支持(当前)两种不同类型的索引 - JSON(包装 map/reduce)和文本(包装 Cloudant Search/Lucene)。文本索引更灵活,JSON 索引更高效。

    文本索引的默认行为是为每个字段建立索引,我们建议从这个开始,除非您知道您的数据库将变得非常大(100 GB)或复杂。您可以通过 PouchDB create one 使用:

    remoteDB.createIndex({
       name: "myindex",
       index": {},
       type: "text"
    }).then(function (result) {
       // yo, a result
    }).catch(function (err) {
       // ouch, an error
    });
    

    或通过 CURL:

    curl -u <username> 'https://<username>.cloudant.com/<db>/_index' -X POST -H'Content-Type:application/json' -d '{"index":{},"type":"text"}'
    

    如果要更改索引以省略“数据”,可以指定要索引的字段:

    remoteDB.createIndex({
       name: "myindex",
       index": {
           "fields": ["_id","_rev","type","label","notes","project"]
       },
       type: "text"
    }).then(function (result) {
       // yo, a result
    }).catch(function (err) {
       // ouch, an error
    });
    

    创建该索引后,您的 PouchDB-Find 查询应该可以工作了。

    如果您想详细了解 Cloudant 中不同类型的查询机制(Cloudant Query、Cloudant Search 和 map/reduce),learning centre 是一个很好的起点。

    【讨论】:

    • 感谢您的详细回复。你能建议吗,比如说,如果我在数据库中有不同类型的文档,我可以用 type=='certain_type' 索引这些给定字段的文档吗?我想为不同的字段指定不同的类型而不是所有文本怎么样?
    • 您可以通过在索引中添加“选择器”字段来为不同的文档类型创建不同的索引(例如,我建议您参考docs.cloudant.com/api.html#query 的文档)。如果您需要更多控制,那么我建议您改为查看 Cloudant Search 索引。 PouchDB 中没有直接支持这些,但可以很容易地直接进行 HTTP 调用或编写一个小的 PouchDB 插件来调用搜索索引。
    • 还值得一提的是,PouchDB、CouchDB 和 Cloudant 具有不同的查询选项 - 不需要/不希望您在所有平台上使用相同的索引策略。
    • 太棒了。出于某种原因,我只是忽略了这个 api。这解释了一切。干杯!
    【解决方案2】:

    这里的地图功能在哪里?

    map 函数用于在 couchdb 上创建二级索引,允许您通过特定键查询文档。默认情况下,couchdb 中只有一个索引可用,并且只能通过 _id 字段查询。

    Cloudant 目前支持两种创建索引的方式。首先是借助 map 和 reduce 函数的传统方式。

    然后他们有一个新的query api。在您的示例中,您正在使用查询 api[1]。

    有人可以提出一种简单的方法来设计可以轻松查询有关特定类型文档的所有字段的视图吗?有没有简单的“if(type=='some type') indexAll();”解决方案?

    这是一个适合你的地图功能

    function(doc){
    for(var prop in Object.keys(doc))
    if(prop!=="data") emit(doc[prop]);
    }
    

    这使得除了“数据”之外的所有字段都可以查询。

    这在设计文档中的什么位置?这里

    "views": {
        "units_modal": {
          "map": "function(doc){for(var prop in Object.keys(doc))if(prop!=="data"){emit(doc[prop])};
    }"
          }
    

    这里要注意的一点是,设计文档与任何其他存储 json 数据的 couchdb 文档一样。但是 json 中不允许使用函数。因此,您要么必须手动对它们进行字符串化,要么使用可以帮助您执行此操作的库,例如 couchapp

    pouchdb 的索引将用于客户端数据库。因此,如果您在 pouchdb 数据库上创建索引,那么这些索引将不适用于您的远程 cloudant/couchdb 数据库。

    但是用于查询和创建索引的api 是完全一样的。

    此外,如果您想在 pouchdb 中使用 cloudant“查询语法”样式的查询,可以使用 plugin 来帮助您做到这一点。

    [1]目前在 couchdb 中只允许使用 map reduce 函数(最高 1.6.1)。但他们也在努力在 2.0 中合并查询语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多