2012-06-01 2 views
2

Google AppEngine에 실험용 검색 API를 사용하려고했습니다. SDK 1.6.6을 사용하고 있습니다. 지금까지 인덱스에 항목을 추가하고 개발 환경에서 검색 할 수있었습니다. 내 응용 프로그램을 배포 할 때 , 난 여전히 인덱스에 항목을 추가 할 수 있습니다,하지만 난 검색을 수행 하려고 할 때, 나는 다음과 같은 예외 로그 수 :App Engine 용 전체 텍스트 검색 API (Java)

br.com.qmagico.server.service.search.GenericSearchService search: Busca com query 'soma' falhou 
com.google.appengine.api.search.SearchException: 
at com.google.appengine.api.search.IndexImpl$3.convertException(IndexImpl.java:268) 
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:106) 
at com.google.appengine.api.search.FutureHelper.getInternal(FutureHelper.java:74) 
at com.google.appengine.api.search.FutureHelper.quietGet(FutureHelper.java:33) 
at com.google.appengine.api.search.IndexImpl.search(IndexImpl.java:390) 
at br.com.qmagico.server.service.search.GenericSearchService.search(GenericSearchService.java:109) 
at br.com.qmagico.server.service.search.AulaSearchService.search(AulaSearchService.java:50) 
at br.com.qmagico.server.handler.GetAulasHandler.executeLoggedException(GetAulasHandler.java:45) 
at br.com.qmagico.server.handler.GetAulasHandler.executeLoggedException(GetAulasHandler.java:1) 
at br.com.qmagico.server.QmActionHandler.execute(QmActionHandler.java:23) 
at com.gwtplatform.dispatch.server.AbstractDispatchImpl.doExecute(AbstractDispatchImpl.java:153) 
at com.gwtplatform.dispatch.server.AbstractDispatchImpl.execute(AbstractDispatchImpl.java:111) 
at com.gwtplatform.dispatch.server.AbstractDispatchServiceImpl.execute(AbstractDispatchServiceImpl.java:81) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:616) 
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$1.run(Method_.java:165) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:163) 
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke_(Method_.java:124) 
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:43) 
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263) 
at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178) 
at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91) 
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62) 
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118) 
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
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:249) 
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:135) 
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:477) 
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455) 
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453) 
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
at java.lang.Thread.run(Thread.java:679) 

이 검색을 수행하는 코드의 조각이 하나입니다 :

public List<Long> search(Index index, String queryStr, String sortField) { 
    ArrayList<Long> ids = new ArrayList<Long>(); 
    if (queryStr != null && !queryStr.isEmpty()) { 
     int limit = 5; 
     try { 
      QueryOptions.Builder builder = QueryOptions.newBuilder().setLimit(limit); 
      if (sortField != null) { 
       builder = builder.setSortOptions(SortOptions.newBuilder() 
        .addSortExpression(SortExpression.newBuilder() 
         .setExpression(sortField) 
         .setDefaultValue("") 
         .setDirection(SortExpression.SortDirection.DESCENDING)) 
        .build()); 
      } 
      QueryOptions queryOptions = builder.build(); 

      Query query = Query.newBuilder() 
       .setOptions(queryOptions) 
       .build(queryStr); 
      LOG.info("Enviando query " + query); 
      Results<ScoredDocument> results = index.search(query); 
      for (ScoredDocument scoredDoc : results) { 
       ids.add(scoredDoc.getOnlyField("id").getNumber().longValue()); 
      } 
     } catch (RuntimeException e) { 
      LOG.log(Level.SEVERE, "Busca com query '" + queryStr + "' falhou", e); 
     } 
    } 
    return ids; 
} 

이 문제를 해결하기 위해 내가해야 할 일이 있습니까?

Thx!

답변

0

SortOptions 제거를 시도 했습니까? SortOptions를 설정할 때 동일한 오류가 발생합니다. 나는 이것이 버그라고 생각합니다.

2

정렬이 문제라고 생각되면 문서 순위를 사용하여 색인에서 문서를 미리 정렬하는 것이 좋습니다. 문서의 순위 필드는 기본적으로 2011 년 1 월 1 일 이후의 초 수로 설정됩니다. 그러나 정수 순위 값을 제공 할 수 있습니다. 예를 들어, 제품 카탈로그를 가격 (낮은 가격에서 높은 가격과 높은 가격과 낮은 가격)로 정렬하려는 경우. 순위는 색인의 문서를 사전 정렬하는 데 사용됩니다. 당신이 당신의 색인을 검색 할 때 사용자가 "높은 낮은 가격을"선택 "LED TV"를 조회 한 경우

public Index getIndex(String indexName) { 
    IndexSpec indexSpec = IndexSpec.newBuilder().setName(indexName).build(); 
    return SearchServiceFactory.getSearchService().getIndex(indexSpec); 
} 

Document doc = Document.newBuilder() 
    .addField(Field.newBuilder().setName('name').setText("some text")) 
    .setRank(functionToGetPrice()) 
    .build(); 

getIndex("productHighToLow").put(doc); 

doc = Document.newBuilder() 
    .addField(Field.newBuilder().setName('name').setText("some text")) 
    .setRank(MAXINT-functionToGetPrice()) 
    .build(); 

getIndex("productLowToHigh").put(doc); 

그런 다음, 당신은 단순히

getIndex("productLowToHigh").search("LED TV"); 

과 같은 쿼리를 실행할 수 있습니다 큰 (제품 + 탈 로그) 색인에 대해서조차도 더 빨리 의미 론적으로 올 Y 르게됩니다.

+0

동일한 문서를 여러 인덱스에 추가 할 수 있습니까? 예를 들어,이 문서를 'productHighToLow' 색인에도 추가 할 수 있습니까 (어느 쪽이든 정렬 할 수 있도록)? – markvgti

+0

@markvgti : 그것은 Ged의 대답이 보여주는 것과 거의 같습니다. 그렇지 않습니까? Document 인스턴스 간의 유일한 차이점은 순위 값입니다. 말 그대로 동일한 인스턴스를 두 개의 인덱스에 넣을 수는 있지만 순위 값을 다르게하여 원하는 정렬 결과를 얻지는 못합니다. – Alan

관련 문제