Google app engine AppEngine全文搜索游标在开发/单元测试环境中损坏
我注意到在devserver或单元测试环境与生产环境中,appengine文本搜索游标的行为不一致。开发环境和单元测试环境似乎显示了与排序表达式结合使用的游标的错误。考虑下面的单元测试代码:Google app engine AppEngine全文搜索游标在开发/单元测试环境中损坏,google-app-engine,full-text-search,Google App Engine,Full Text Search,我注意到在devserver或单元测试环境与生产环境中,appengine文本搜索游标的行为不一致。开发环境和单元测试环境似乎显示了与排序表达式结合使用的游标的错误。考虑下面的单元测试代码: @Test public void testQueryCursor( ) throws Exception { testQueryCursor("id_%02d"); // works testQueryCursor("id_%d"); // fails } private void te
@Test
public void testQueryCursor( ) throws Exception
{
testQueryCursor("id_%02d"); // works
testQueryCursor("id_%d"); // fails
}
private void testQueryCursor( final String idFmt ) throws Exception
{
final int TEST_COUNT = 12;
final Index index =
SearchServiceFactory.getSearchService().getIndex(IndexSpec.newBuilder().setName("MY_TEST_IDX").build());
final List<String> docIds = new ArrayList<String>(TEST_COUNT);
try {
// populate some test data into an index
for (int i = 0; i < TEST_COUNT; i++) {
final String docId = String.format(idFmt, i);
final Document.Builder builder = Document.newBuilder().setId(docId);
builder.addField(Field.newBuilder().setName("some_field").setText("str1 " + docId)); // include varied docId in field for sorting
index.put(builder.build());
docIds.add(docId);
}
// for comparison to sorted search results
Collections.sort(docIds);
// define query options
final QueryOptions.Builder optionsBuilder =
QueryOptions
.newBuilder()
.setReturningIdsOnly(true)
.setLimit(10)
.setSortOptions(
SortOptions
.newBuilder()
.setLimit(20)
.addSortExpression(
SortExpression.newBuilder().setExpression("some_field")
.setDirection(SortDirection.ASCENDING).setDefaultValue("")));
// see https://developers.google.com/appengine/docs/java/search/results#Java_Using_cursors
// create an initial per-query cursor
Cursor cursor = Cursor.newBuilder().build();
final Iterator<String> idIter = docIds.iterator();
int batchIdx = 0;
do {
// build options and query
final QueryOptions options = optionsBuilder.setCursor(cursor).build();
final Query query = Query.newBuilder().setOptions(options).build("some_field : str1");
// search at least once
final Results<ScoredDocument> results = index.search(query);
int batchCount = 0;
for (final ScoredDocument match : results) {
batchCount++;
assertTrue(idIter.hasNext());
assertEquals(idIter.next(), match.getId());
System.out.println("Document " + match.getId() + " matched.");
}
System.out.println("Read " + batchCount + " results from batch " + ++batchIdx);
cursor = results.getCursor();
} while (cursor != null);
} finally {
index.delete(docIds);
}
}
@测试
public void testQueryCursor()引发异常
{
testQueryCursor(“id_%02d”);//有效
testQueryCursor(“id_%d”);//失败
}
私有void testQueryCursor(最终字符串idFmt)引发异常
{
最终整数测试计数=12;
最终索引=
SearchServiceFactory.getSearchService().getIndex(IndexSpec.newBuilder().setName(“MY_TEST_IDX”).build());
最终列表docIds=新阵列列表(测试计数);
试一试{
//将一些测试数据填充到索引中
对于(int i=0;i
如果assertEquals(idIter.next(),match.getId())代码>行被注释掉之前失败调用的完整输出可以观察到testQueryCursor(“id_%d”)
,我们看到结果的正确顺序似乎被忽略。此外,在光标上执行的最后一次搜索会重复上一次搜索调用中检索到的最后两个元素。由于这两个元素应该是搜索返回的最后两个元素,因此此行为可能只是导致不正确排序的缺陷的产物
此代码可以很容易地作为单元测试运行,如图所示,也可以从devserver上的JSP运行,并且行为是一致的。当在AppEngine的生产实例上作为JSP运行时,行为的不同之处在于搜索在所有情况下都返回正确排序的结果。如果devserver环境和单元测试工具得到修复,以提供与生产一致的正确行为,那就太好了。在我看来,在本地运行的wrt fulltextsearch(在SDK中,而不是在prod中)存在一些未解决的问题,但还没有发现您的具体问题——可能会出现新的缺陷?谢谢Alex,我刚刚向谷歌提交了我的第一个bug: