0

com.couchbase.client, java-clientバージョンを使用2.2.7して、パラメーター化された IN 句を使用する n1ql セカンダリ インデックスを機能させることができませんでした。以下のインデックス、クエリ、および Java コードの例を参照してください。

索引

CREATE INDEX `indexName` ON `bucketName`(id,docType) USING GSI ;

クエリ

public static final String COUNT_STATEMENT = "select count(*) as count " +
            "from bucketName " +
            "where docType = 'docId' " +
            "and id IN $ids " + 
            "and publishTimestamp between $startTime and $endTime";

クエリを送信するコード

public int getCountForDuration(Long startTime, Long endTime, Collection<String> ids){
    List<String> idList = new ArrayList<>(ids);
    JsonObject placeHolders = JsonObject.create()
                                        .put("ids", JsonArray.from(idList))
                                        .put("startTime", startTime)
                                        .put("endTime", endTime);
    N1qlQuery query = N1qlQuery.parameterized(COUNT_STATEMENT, placeHolders)            
    N1qlQueryResult result = bucket.query(query);
    ...
}

パラメータ化を追加する前は、このセカンダリ インデックスはクエリで正しく使用されていました。また、プライマリ インデックスを使用すると、クエリが機能します。

私の質問は、クエリで使用されるセカンダリ インデックスを作成する方法です。

4

2 に答える 2

2

インデックスの最初のエントリ (あなたの場合id) を欠落させることはできません。そのため、行方不明のドキュメントidはインデックスに登録されません。したがって、インデックスの条件によって既に制約されているフィールドを使用しない場合は、欠落していないことを指定して、セカンダリ インデックスに移動できるようにする必要があります。

たとえば、次のインデックスを次のようにクエリできますtype="entityType"

CREATE INDEX `indexName` ON `bucketName`(type) WHERE `type`="entityType"

于 2016-08-09T08:37:53.760 に答える
2

追加の句を追加してこれを解決しましたがis not missing、何らかの理由でこれが解決しました。同じ解決策がパスで機能しました。更新されたクエリは次のとおりです。

public static final String COUNT_STATEMENT = "select count(*) as count " +
        "from bucketName " +
        "where id is not missing " + 
        "and docType = 'docId' " +
        "and id IN $ids " + 
        "and publishTimestamp between $startTime and $endTime";

@ベンワイルドコメント -

「「欠落している」が必要な理由は、インデックスの最初のエントリ (「この」場合は ID) が欠落していないためです。そのため、ID が欠落しているドキュメントはインデックスに含まれないため、インデックスによって設定された条件によって既に制約されているフィールドの場合、セカンダリ インデックスに確実に移動できるように、欠落していないことを指定する必要があります。」

于 2016-08-03T01:07:25.057 に答える