1

CouchBase(4.1.1) では、N1QL は要素全体を使用してインデックスを作成できます。これらの 2 つの例を見てください。

次のドキュメント構造があるとします。

{
   "name": "blah",
   "credentials": [
       {
          "level": 5,
          "sector": "XP"
       }
   ],
}

ここで、名前と資格情報要素全体に基づいて index1 を作成したいとします。それは可能ですか?

何かのようなもの

create index indexName on `bucketName` (name, credentials) USING GSI;

または、name と level などのネストされたフィールドの 1 つに基づく index2。これはどのように行うことができますか?何かのようなもの

create index indexName on `bucketName`(name, credential.levels) USING GSI; 

Explain を実行すると、セカンダリ インデックスは使用されておらず、couchbase はデフォルトでこのバケットのプライマリ インデックスになります。

これが私が使用している選択です。

select s.name, s.credentials 
from `security` unnest s.credentials
where credentials is not missing and name = 'tom';

作成された説明は次のとおりです。

{
    "requestID": "f8d46eeb-3898-4ace-a24f-1582e0504eb7",
    "signature": "json",
    "results": [
        {
            "#operator": "Sequence",
            "~children": [
                {
                    "#operator": "PrimaryScan",
                    "index": "#primary",
                    "keyspace": "read",
                    "namespace": "default",
                    "using": "gsi"
                },
                {
                    "#operator": "Parallel",
                    "~child": {
                        "#operator": "Sequence",
                        "~children": [
                            {
                                "#operator": "Fetch",
                                "as": "s",
                                "keyspace": "bucketName",
                                "namespace": "default"
                            },
                            {
                                "#operator": "Unnest",
                                "as": "beacons",
                                "expr": "(`s`.`credentials`)"
                            },
                            {
                                "#operator": "Filter",
                                "condition": "((`s`.`name`) = \"tom\")"
                            },
                            {
                                "#operator": "InitialProject",
                                "result_terms": [
                                    {
                                        "expr": "(`s`.`id`)"
                                    },
                                    {
                                        "expr": "`credentials`"
                                    }
                                ]
                            },
                            {
                                "#operator": "FinalProject"
                            }
                        ]
                    }
                }
            ]
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "2.82063ms",
        "executionTime": "2.765439ms",
        "resultCount": 1,
        "resultSize": 1917
    }
}
4

2 に答える 2

2

私の調査結果に基づいて、インデックスを作成しようとしている場合は、インデックスを作成しているフィールドを含まないドキュメントを除外する必要があります。したがって、上記の例では、次のように追加しました。ステートメントname is not missing内で、クエリがセカンダリ インデックスの使用を開始しました。where

Couchbase サイトからの以下の宣伝文句は、この発見に私を導きました

注意: MISSING 項目はインデクサーによって索引付けされません。カバー インデックスを利用し、インデックスを修飾するには、インデックス キー式が MISSING と評価されるドキュメントをクエリで除外する必要があります。

于 2016-07-06T06:05:55.780 に答える
1

次のクエリでは、インデックスを使用する必要があります。

select s.name, s.credentials 
from `security` s
where s.credentials is not missing and s.name = 'tom';

select s.name, credentials 
from `security` s unnest s.credentials
where s.credentials is not missing and s.name = 'tom';
于 2016-06-28T06:59:31.387 に答える