私のアプリケーションは現在、必要なすべての最適なインデックスを定義しています。しかし、ゆっくりとインデックスの爆発的な問題に悩まされ始めたので、ここで説明するように、戦略を切り替えて「ジグザグ」マージの使用を開始したいと思います。
私のエンティティContact
には3つの並べ替え順序があります:
lastModified
ASCfullNameUpperCase
ASC + DESC
4つのフィルターがあります:
contactProfile
contactStatus
contactType
searchFields
('startsWith ...'をエミュレートする不等式クエリ)
searchFieldsは特殊なケースです。これは、このように「startswith」をエミュレートするために使用するためです。
query = query.filter("searchFields >= ", criteria.getSearchString().toUpperCase());
query = query.filter("searchFields <= ", criteria.getSearchString().toUpperCase() + "\ufffd");
記事の説明に続いて、私は定義する必要があります
(number of filters + 1) * (number of orders) = 5 * 3 = 15.
- 私の主な問題!:
以下の新しい定義は開発サーバーで機能するようですが、初めてではありません。初めてジグザグマージの新しい組み合わせを実行する必要がある場合でも、devserverはDatastoreNeedIndexExceptionをスローします。同じクエリを2回繰り返すと、クエリが実行され、期待される結果が返されます。これは、結果をページングするときにも発生します。次のページを初めてクエリすると、例外がスローされます。繰り返し作品。誰もがこの振る舞いを見たことがありますか?このdevserverの問題ですか、それとも何かが足りませんか?または、このインデックス作成は最初は不完全なのかもしれません...たとえば、devserverは、これらのフィルターを初めて組み合わせるときに、これがインデックスとして欠落していると文句を言います。
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="contactProfile" direction="asc"/>
<property name="status" direction="asc"/>
<property name="fullNameUpperCase" direction="desc"/>
</datastore-index>
エンティティContactの新しいインデックス定義は次のとおりです。
<!-- SORT ORDERS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="lastModified" direction="desc" />
</datastore-index>
<!-- FILTER: SEARCHFIELDS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="asc" />
<property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="desc" />
<property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="lastModified" direction="desc" />
<property name="searchFields" direction="asc" />
</datastore-index>
<!-- FILTER: CONTACTSTATUS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="asc" />
<property name="status" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="desc" />
<property name="status" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="lastModified" direction="desc" />
<property name="status" direction="asc" />
</datastore-index>
<!-- FILTER: CONTACTTYPE -->
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="asc" />
<property name="contactType" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="desc" />
<property name="contactType" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="lastModified" direction="desc" />
<property name="contactType" direction="asc" />
</datastore-index>
<!-- FILTER: CONTACTPROFILE -->
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="asc" />
<property name="contactProfile" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="fullNameUpperCase" direction="desc" />
<property name="contactProfile" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
<property name="lastModified" direction="desc" />
<property name="contactProfile" direction="asc" />
</datastore-index>