【问题标题】:Cloudant Search: what are the conditions for using the count facet?Cloudant Search:使用计数方面的条件是什么?
【发布时间】:2017-04-30 09:16:10
【问题描述】:

我正在尝试使用 Cloudant 设置搜索索引,但我发现 the documentation 非常混乱。它指出:

刻面

为了使用分面,索引中的所有文档都必须包含所有启用分面的字段。如果您的文档未包含所有字段,您将收到 bad_request 错误,原因如下:“dim field_name 不存在”。

如果每个文档不包含构面的所有字段,建议您为每个字段创建单独的索引。如果您不为每个字段创建单独的索引,则必须仅包含包含所有字段的文档。使用单个 if 语句验证每个文档中是否存在字段。

计数

count facet 语法采用字段列表,并返回每个命名字段的每个唯一值的查询结果数。

仅当索引值为字符串时,计数操作才有效。索引值不能是混合类型。例如,如果索引了 100 个字符串和一个数字,则索引不能用于计数操作。您可以使用 typeof 运算符检查类型,并使用 parseInt、parseFloat 和 .toString() 函数进行转换。

具体来说,“索引中的所有文档都包含所有启用了分面的字段”是什么意思。

例如,如果我的数据库包含以下文档:

{
  "_id": "mydoc"
  "subjects": [ "subject A", "subject B" ]
}

我这样写了一个搜索索引:

function (doc) {
  for(var i=0; i < doc.subjects.length; i++)
    index("hasSubject", doc.subjects[i], {facet: true});
}

这是否是非法的,因为mydoc 没有名为hasSubject 的字段?而当我们将查询重写为如下所示时;

{
  "_id": "mydoc"
  "hasSubject": true,
  "subjects": [ "subject A", "subject B" ]
}

会不会突然好起来...?

【问题讨论】:

    标签: search cloudant faceted-search


    【解决方案1】:

    所以新文档位于 https://console.ng.bluemix.net/docs/services/Cloudant/api/search.html#faceting ;但是,刻面的条目是相同的。所以没什么大不了的。

    不过,为了回答您的问题,我认为文档所说的是您数据库中的所有 JSON 文档都必须包含 subjects 字段,这就是您要在示例中声明的内容。

    所以我也会考虑像这样定义您的搜索索引:

    function (doc) {
      if (doc.subjects) {
        for(var i=0; i < doc.subjects.length; i++) {
          if (typeof doc.subjects[i] == "string") {
            index("hasSubject", doc.subjects[i], {facet: true});
          }
        }
      }
    }
    

    如果您的数据库中有这样的文档:

    {
      "_id": "mydoc"
      "hasSubject": true,
    }
    

    我认为这会让你的脸突然变得不好。

    【讨论】:

    • 哼……说的有道理!所以它只是针对您索引doc.fieldfield 未定义的情况做准备?
    • 是的。通常,如果您打算对某个字段进行构面,您希望确保这些字段存在并且没有未定义。我想这就是我们俩所说的。
    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2015-10-15
    • 1970-01-01
    • 2020-09-21
    • 2022-01-02
    相关资源
    最近更新 更多