Cloudant搜索:使用count facet的条件是什么?

时间:2017-04-30 09:16:10

标签: search cloudant faceted-search

我正在尝试使用Cloudant设置搜索索引,但我发现the documentation非常令人困惑。它声明:

  

FACETING

     

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

     

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

     

计数

     

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

     

只有当索引值是字符串时,count操作才有效。索引值不能是混合类型。例如,如果索引了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" ]
}

这会突然变得好吗......?

1 个答案:

答案 0 :(得分:2)

所以新文件位于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,
}

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