3

私は一般的に、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"
}

私の検索キーは、たとえば「カーボン トラスト」、「排出量」、「優秀な評価」などです。

私が持っているのは、POST リクエストの Node.js アプリケーションのリクエスト本文で使用する一時的なマップ関数ですが、それは正しいアプローチではないと確信しており、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);
        }
    }
}

アプローチを改善するために何をする必要があるか、または不明な点がある場合はお知らせください。

よろしく

4

2 に答える 2

2

リスト関数はクエリ文字列値にアクセスできるため、ビューと組み合わせて使用​​するものを追加するだけです。

マップ機能

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
    }));
}

もちろん、リスト関数を変更して、一度にすべてではなくチャンクでデータを出力することもできますが、これにより、このようなソリューションがどのようなものかがわかります。

于 2013-05-20T13:56:35.160 に答える
0

代わりに、キーがキーワード (または代わりに任意の単語) で、値が_ids であるビューを構築できます。

欠点は、このビューが非常に大きくなる可能性があることです。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: 実際には、大文字と小文字を正規化し、句読点を削除し、 atheofなどの一般的な単語を削除する必要があります。</sub>

于 2013-05-19T19:56:58.060 に答える