1

나는 단지 데모 프로젝트에서 작업 중이고 그 중 하나는 유형에 대한 기본 쿼리를 제공합니다.GAE 및 Objectify 질의 및 오류 (order)를 사용하여

public List<Conference> filterPlayground(){ 

     Query<Conference> query = (ofy().load().type(Conference.class)).order("name"); 

     query = query.filter("topics =", "Medical Innovations"); 
     query = query.filter("city =","London"); 

     return query.list(); 
} 

내 회의 엔터티에는 이름, 도시 및 주제에 대한 @Index가 있습니다.

그러나 API 탐색기에서 메소드를 실행하면 예외가 발생합니다 (아래 참조). 주문 방법을 사용하는 이유에 대한 빠른 포인터. 나는 그것없이 주문 방법다는 것을 알고있다 아무 과실도 없다. com.google.appengine.api.datastore.DatastoreNeedIndexException :

Uncaught exception from servlet 
java.io.IOException: com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingExcepti on: no matching index found. recommended index is: 
- kind: Conference 
properties: 
- name: city 
- name: topics 
- name: name 

The suggested index for this query is: 
<datastore-index kind="Conference" ancestor="false" source="manual"> 
<property name="city" direction="asc"/> 
<property name="topics" direction="asc"/> 
<property name="name" direction="asc"/> 
</datastore-index> 

(through reference chain: java.util.HashMap["items"]) 
at com.google.api.server.spi.response.ServletResponseResultWriter.writeValueAs String(ServletResponseResultWriter.java:187) 
at com.google.api.server.spi.response.ServletResponseResultWriter.write(ServletResponseResultWriter.java:74) 
at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:394) 
at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:113) 
at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at  com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:257) 
at  org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:145) 
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:511) 
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:446) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:453) 
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:276) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:312) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:304) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:450) 
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:235) 
at java.lang.Thread.run(Thread.java:745) 
Caused by:  com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: no matching index found. recommended index is: 
- kind: Conference 
    properties: 
    - name: city 
    - name: topics 
    - name: name 

The suggested index for this query is: 
<datastore-index kind="Conference" ancestor="false" source="manual"> 
<property name="city" direction="asc"/> 
<property name="topics" direction="asc"/> 
<property name="name" direction="asc"/> 
</datastore-index> 

(through reference chain: java.util.HashMap["items"]) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException.wrapWithPath(JsonMappingException.java:218) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException.wrapWithPath(JsonMappingException.java:183) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.SerializerBase.wrapAndThrow(SerializerBase.java:140) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:266) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:186) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:23) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ObjectWriter._configAndWriteValue(ObjectWriter.java:456) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ObjectWriter.writeValueAsString(ObjectWriter.java:393) 
at com.google.api.server.spi.response.ServletResponseResultWriter.writeValueAsString(ServletResponseResultWriter.java:183) 
... 38 more 

의해 야기되는 매칭 인덱스를 찾을 수 없음. 권장 인덱스는 다음과 같습니다 - 종류 : 회의 속성 : - 이름 : 도시 - 이름 : 주제 - 이름 : 이름

이 쿼리에 대한 제안 된 인덱스는 다음과 같습니다

at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:59) 
at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:128) 
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:97) 
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89) 
at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:76) 
at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:36) 
at com.google.appengine.api.datastore.BaseQueryResultsSource.getIndexList(BaseQueryResultsSource.java:159) 
at com.google.appengine.api.datastore.BaseQueryResultsSource.loadMoreEntities(BaseQueryResultsSource.java:192) 
at com.google.appengine.api.datastore.BaseQueryResultsSource.loadMoreEntities(BaseQueryResultsSource.java:171) 
at com.google.appengine.api.datastore.QueryResultIteratorImpl.ensureLoaded(QueryResultIteratorImpl.java:148) 
at com.google.appengine.api.datastore.QueryResultIteratorImpl.hasNext(QueryResultIteratorImpl.java:64) 
at com.googlecode.objectify.impl.KeysOnlyIterator.hasNext(KeysOnlyIterator.java:29) 
at com.googlecode.objectify.impl.ChunkIterator.next(ChunkIterator.java:48) 
at com.googlecode.objectify.impl.ChunkIterator.next(ChunkIterator.java:20) 
at com.google.common.collect.Iterators$5.hasNext(Iterators.java:597) 
at com.google.common.collect.Iterators$PeekingImpl.hasNext(Iterators.java:1216) 
at com.googlecode.objectify.impl.ChunkingIterator.hasNext(ChunkingIterator.java:51) 
at com.google.common.collect.Lists.newArrayList(Lists.java:144) 
at com.google.common.collect.Lists.newArrayList(Lists.java:125) 
at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:21) 
at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:11) 
at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21) 
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30) 
at com.googlecode.objectify.util.ResultProxy.invoke(ResultProxy.java:34) 
at com.sun.proxy.$Proxy30.iterator(Unknown Source) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:45) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) 
at com.google.appengine.repackaged.org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:262) 
... 45 more 

답변

1

앱에 정렬 된 쿼리에 대한 다른 인덱스 정의가 필요합니다. direction도 필요합니다. How to fix index error when querying GAE datastore?

일반적으로 devserver는 로컬 응용 프로그램이 실제로 수행하는 쿼리에 따라 로컬 개발 환경에서 인덱스를 자동으로 생성/업데이트 할 수 있습니다. 그러나 GAE 앱에서 실제로 업데이트 된 색인 파일을 사용하려면 먼저 업데이트 된 색인 파일을 GAE에 수동으로 업로드해야하며 색인 생성이 완료되었는지 확인해야합니다.

devserver가 자동으로 색인 파일을 생성/업데이트하지 못하면 수동으로 수행 할 수 있습니다.

+0

감사합니다 ... – DevelopeXCode

1

오류는 기본적으로 알아야 할 모든 것을 알려줍니다. 당신은 추가해야합니다 :

<datastore-index kind="Conference" ancestor="false" source="manual"> 
<property name="city" direction="asc"/> 
<property name="topics" direction="asc"/> 
<property name="name" direction="asc"/> 
</datastore-index> 

당신의 index configuration에.

이러한 속성에 개별 인덱스가있는 것은 중요하지 않습니다. 이 쿼리에 대한 복합 인덱스 (오류 메시지에 설명 된대로)를 만들어야합니다.

+0

감사합니다. – DevelopeXCode

+0

약간 다른 정렬을 사용하여 몇 개의 datastore-indexes.xml 파일을 만들었으며 이제 Google Datastore Indexes 영역에 두 개가 있습니다. 빠른 방법으로 인덱스를 지우지 않고 몇 가지 테스트를 할 수 있도록 삭제하는 방법은 무엇입니까? – DevelopeXCode

+0

입력 및 링크에 대해 색인 삭제를위한 https://cloud.google.com/appengine/docs/java/config/indexconfig –