使用Cloudant中的视图进行无壳匹配

时间:2014-09-11 01:31:36

标签: regex cloudant

我有一个包含以下数据结构的文档数据库:

{
    "_id": "sampleID",
    "_rev": "sample-rev",
    "added": "2014-09-09 01:05:32",
    "cached": 1,
    "subject": "sample topic",
    "mode": "<samplemode>",
    "protected": 0,
    "added_by": "myname",
    "factoid": "sample factoid"
}

我有以下观点:

function(doc) {
    if (doc.subject && doc.factoid && doc.mode){
        emit(doc.subject, doc.factoid);
    }
}

我需要检索“主题”与提供的密钥匹配的所有文档。我希望它不区分大小写。 POST将为我提供我想要的所有匹配项,但仅限于案例匹配。

https://<username>.cloudant.com/<db>/_design/<designdoc>/_view/<view>?include_docs=true

{ "keys" : ["<subject>"] }

我也试过搜索索引但没有成功。这个API提到了一个我无法工作的正则表达式运算符。这看起来很简单,我应该怎样接近这个?

关于$ regex方法,这就是我所处的位置。以下POST的工作方式与我以前尝试返回区分大小写的结果非常相似。

https://<username>.cloudant.com/<db>/_find

{
    "selector": {
        "subject": {"$eq": "<subject>"}
    },
    "fields": ["_id", "_rev", "subject", "factoid"]
}

用$ regex运算符替换$ eq会产生以下错误:

{
"error": "no_usable_index",
"reason": "There is no operator in this selector can used with an index."
}

此功能的参考材料相当纤薄。仅在此页面上提及:https://docs.cloudant.com/api/cloudant-query.html

2 个答案:

答案 0 :(得分:3)

我认为使用Cloudant Query $ regex运算符是可行的方法。

您在加入该错误时收到该错误的原因是因为您无法使用$ regex作为选择器表达式的基础。以下是其文档中的相关位(https://docs.cloudant.com/api.html#condition-operators):

  

但是,并非所有运算符都可以用作选择器表达式的基础或起点。

     

您不能使用组合或数组逻辑运算符(例如$ regex)作为查询的基础。

相反,你可以这样做:

https://<username>.cloudant.com/<db>/_find

{
    "selector": {
        "_id": {
            "$gt": null
        },
        "subject": {"$regex": "<subject>"}
    },
    "fields": ["_id", "_rev", "subject", "factoid"]
}

这应该会为您提供您正在寻找的结果,但是,文档会继续说明以下内容,因此请注意大型数据库:

  

此表达式始终为true,从而可以应用选择器表达式的其余部分。

     

使用{“_ id”:{“$ gt”:null}}会导致全表扫描,对大型数据库效率不高。

答案 1 :(得分:0)

一个选项是创建一个存储大写搜索字符串的二级索引:

function(doc) {
    if (doc.subject){
        emit(doc.subject.toUpperCase());
    }
}

然后,应用程序可以在将搜索条件发送到数据库之前将其大写:

https://username.cloudant.com/database/_design/designdoc/_view/view?key=“SAMPLE TOPIC"&include_docs=true

会导致这个:

{
    "offset": 0,
    "rows": [
        {
            "doc": {
                "_id": "sampleID",
                "_rev": "1-d77a468b74497771f8d37130a7cf02eb",
                "added": "2014-09-09 01:05:32",
                "added_by": "myname",
                "cached": 1,
                "factoid": "sample factoid",
                "mode": "<samplemode>",
                "protected": 0,
                "subject": "sample topic"
            },
            "id": "sampleID",
            "key": "SAMPLE TOPIC",
            "value": null
        }
    ],
    "total_rows": 1
}