我正在尝试使用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" ]
}
这会突然变得好吗......?
答案 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,
}
我认为这会让你的方面突然变得不好。