有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java GoogleAppEngine:GenericScorer。搜索抛出NegativeArraySizeException

我正在尝试在我的项目中搜索索引。 当我用
searchText:学期:“S1/2016”和状态:已验证和emp_id>;0 ,我得到了正确的结果

当我用
searchText:学期:“S1/2016”和状态:已验证和emp_id>;500,我得到了以下例外

java.lang.NegativeArraySizeException
    at com.google.appengine.api.search.dev.GenericScorer.search(GenericScorer.java:196)
    at com.google.appengine.api.search.dev.LocalSearchService.searchForApp(LocalSearchService.java:584)
    at com.google.appengine.api.search.dev.LocalSearchService.search(LocalSearchService.java:534)
    at sun.reflect.GeneratedMethodAccessor93.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.callInternal(ApiProxyLocalImpl.java:541)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:484)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:461)
    at java.util.concurrent.Executors$PrivilegedCallable$1.run(Executors.java:493)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.util.concurrent.Executors$PrivilegedCallable.call(Executors.java:490)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

下面是我执行搜索的代码:

public Results<ScoredDocument> retrieveDocuments(String searchText) {
    if (searchText.length() > 2000) {
        throw new InternalException(new Exception("Error - Too long query !!"),
        BaseValidationMessages.SEARCH_STRING_EXCEEDS_LIMIT);
    }
    QueryOptions options =QueryOptions.newBuilder().setOffset(0).setLimit(2)
                                        .setSortOptions(createSortOptions("emp_id", "asc")).build();
    Query query = Query.newBuilder().setOptions(options).build(searchText);
    IndexSpec indexSpec = IndexSpec.newBuilder().setName("Beneficiaries").build();
    Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
    return index.search(query);
}

共 (1) 个答案

  1. # 1 楼答案

    如果传递给索引搜索的偏移量超出可用结果计数的范围,Google Appengine将抛出NegativeArraySizeException

    例如,对于给定的搜索查询文本,考虑到在搜索索引中有50个文档可用,如果搜索查询选项中的偏移集大于50,那么它将在执行搜索时抛出否定的RaysiResiZeExpRebug。p>
    QueryOptions options = QueryOptions.newBuilder().setOffset(**51**)
    

    因此,在设置偏移量之前,请确保可以使用之前的结果对文档进行偏移

    第一个问题:

    QueryOptions options = QueryOptions.newBuilder().setOffset(0).setLimit(50);
    IndexSpec indexSpec = IndexSpec.newBuilder().setName("Beneficiaries").build();
    Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
    Results<ScoredDocument>results = index.search(query);
    

    如果上述查询返回的结果等于50,则搜索下一个集合

    QueryOptions options = QueryOptions.newBuilder().setOffset(**51**)
    

    如果返回的结果小于50,那么我们可以假设,没有更多的结果可用于搜索偏移量>;50,那么我们就可以停止进一步的搜索了