0

私は、couchbase を使用して翻訳を保存するシステムを開発しています。

バケットには、次のような約 15,000 のエントリがあります。

{
  "classifications": [
    {
      "documentPath": "Test Vendor/Test Project/Ordered",
      "position": 1
    }
  ],
  "id": "message-Test Vendor/Test Project:first",
  "key": "first",
  "projectId": "project-Test Vendor/Test Project",
  "translations": {
    "en-US": [
      {
        "default": {
          "owner": "414d6352-c26b-493e-835e-3f0cf37f1f3c",
          "text": "first"
        }
      }
    ]
  },
  "type": "message",
  "vendorId": "vendor-Test Vendor"
},

そして、例として、「テストベンダー/テストプロジェクト/注文済み」の「documentPath」で分類されたすべてのメッセージを見つけたいと思います。

私はこのクエリを使用します:

SELECT message.*
FROM couchlate message UNNEST message.classifications classification
WHERE classification.documentPath = "Test Vendor/Test Project/Ordered"
      AND message.type="message"
ORDER BY classification.position

しかし、クエリの実行に 2 秒かかることに非常に驚いています。

クエリ実行プランを見ると、couchbase がすべてのメッセージをループしてから、"documentPath" でフィルタリングしているようです。

最初に「documentPath」をフィルタリングして(実際にはクエリに一致する documentPath が 2 つしかないため)、メッセージを見つけたいと思います。

「分類」のインデックスを作成しようとしましたが、何も変わりませんでした。

インデックスの設定に何か問題がありますか?それとも、データを別の方法で構造化して迅速に結果を取得する必要がありますか?

それが問題なら、私はcouchbase 4.5ベータを使用しています。

4

1 に答える 1

2

クエリは documentPath フィールドでフィルター処理するため、分類のインデックスは実際には役に立ちません。Couchbase 4.5 の新しい配列インデックス構文を使用して、documentPath フィールド自体に配列インデックスを作成する必要があります。

CREATE INDEX ix_documentPath ON myBucket ( DISTINCT ARRAY c.documentPath FOR c IN classifications END ) ;

次に、次のようなクエリで documentPath をクエリできます。

SELECT * FROM myBucket WHERE ANY c IN classifications SATISFIES c.documentPath = "your path here" END ;

クエリの先頭に EXPLAIN を追加して実行プランを表示し、実際にインデックス ix_documentPath を使用していることを確認します。

詳細と例はこちら: http://developer.couchbase.com/documentation/server/4.5-dp/indexing-arrays.html

于 2016-05-12T13:00:48.560 に答える