Couch DB使用正则表达式搜索正文

时间:2013-05-19 19:06:59

标签: node.js couchdb

我对CouchDB,Map / Reduce和NoSQL很新。

我希望你们能指导我如何在我的Node.js / CouchDB应用程序上实现非常基本的搜索。

我正在寻找CouchDB文档中的某些文本元素。

我在沙发上的大部分文件都有类似的格式:

{
    "_id": "b001729a2c5cf4100ea50a71ec04e20b",
    "_rev": "1-8928ea122d80fd5c1da1c22dfc6ce46e",
    "Approved To Publish": "false",
    "Article Body": "has retained the Carbon Trust Standard for energy and carbon management.Following a demanding audit process that took place in December 2012, was awarded recertification for the Carbon Trust Standard.This certificate is a mark of excellence in recognition of how well we measure, manage and reduce our carbon emissions.",
    "Headline": "Delight retains Carbon Trust Standard"
}

我的搜索键将用于“碳信托”,“排放”,“卓越识别”等。

我所拥有的是一个临时地图函数,我在我的Node.js应用程序的请求主体中使用POST请求,但我确信它不是正确的方法,我希望它是一个存储在CouchDB中查看。

我的地图功能:

function (doc) {
    if ('Headline' in doc) {
        if (doc['Article Body'].search(/" + req.body.jsonValue  + "/i) !== -1
            || doc.Headline.search(/" + req.body.jsonValue + "/i) !== -1) {
            var key = doc.Headline,
                value = doc;
            emit(key, value);
        }
    }
}

如果事情不清楚,请告诉我我需要做些什么来改进我的方法或让我知道。

此致

2 个答案:

答案 0 :(得分:2)

list function可以访问查询字符串值,因此您只需添加一个与视图一起使用的值。

地图功能

function (doc) {
    if ("Headline" in doc) {
        emit(doc.Headline, doc);
    }
}

列表功能

function (head, req) {
    var rows = [],
        regex = new RegExp(req.query.search, "i"), // use the querystring param to create the RegExp object
        row;

    while (row = getRow()) {
        if (row.value.Headline.search(regex) > -1 || row.value["Article Body"].search(regex)) {
            rows.push(row);
        }
    }

    // I'm just mocking up what a view's output would look like (not required)
    send(JSON.stringify({
        total_rows: rows.length,
        offset: 0,
        rows: rows
    }));
}

当然你可以修改list函数来以块的形式发出数据,而不是一次性发出数据,但是这应该让你知道这样的解决方案是什么样的。

答案 1 :(得分:0)

您可以建立一个视图,其中键是关键字(或者任何单词),值是_id s。

缺点是这种观点可能会变得非常大。 CouchDB专家可能有更好的解决方案,我认为这是一个典型的问题。

天真的例子 1

function(doc) {
    if ('Headline' in doc) {
        for (key in doc.Headline.split(' ')) {
            emit(key, doc._id)
        }
    }
    if ('Article Body' in doc) {
        for (key in doc['Article Body'].split(' ')) {
            emit(key, doc._id)
        }
    }
}

然后你会用/app/_design/app/_view/search?key="keyword"查询它。

1:您实际上需要对案例进行规范化,删除标点符号,常用字词,例如 a 等等...