devserver/unit 测试环境的 AppEngine 全文搜索查询不一致

AppEngine full-text-search queries inconsistent for devserver/unit test environment

我注意到 AppEngine 的 "production" 全文搜索功能有一个奇怪的行为:

1) 我在 App Engine 中构建了一个文本搜索索引,其中包含一个字段 "full_name",其值如 "Kenny G" 或 "G Money" 以及一个条目 "G G":

final Index index = SearchServiceFactory.getSearchService().getIndex(IndexSpec.newBuilder().setName("MY_IDX").build());
index.put(Document.newBuilder().setId("doc1").addField(Field.newBuilder().setName("name").setText("G G"))
            .build());
index.put(Document.newBuilder().setId("doc2").addField(Field.newBuilder().setName("name").setText("G G G"))
            .build());
index.put(Document.newBuilder().setId("doc3").addField(Field.newBuilder().setName("name").setText("Kenny G"))
            .build());
index.put(Document.newBuilder().setId("doc4").addField(Field.newBuilder().setName("name").setText("G Money"))
            .build());

2) 然后我使用 "G":

的查询字符串搜索索引
final QueryOptions options = QueryOptions.newBuilder().build();
final Query query = Query.newBuilder().setOptions(options).build("G");
for (final ScoredDocument doc : index.search(query).getResults()) {
    for (final Field field : doc.getFields()) {
        System.out.println(field.getType() + ": " + field.getName() + " - " + field.getText());
    }
}

在 devserver/unit 测试环境中,我得到以下输出:

name (TEXT): G G
name (TEXT): G G G
name (TEXT): Kenny G
name (TEXT): G Money

运行 在 "production" App Engine 上的 JSP 中同样的事情只产生:

name (TEXT): Kenny G
name (TEXT): G Money

请注意,字段值为 "G G"(或 "G G G" 的文档不会返回。

索引的最小字段长度是否有记录限制?显然标记化接受单个字符的标记,否则 "Kenny G" 示例将失败。非常令人费解,看起来像是一个潜在的错误,但也许我错过了一些记录。

生产服务器实现了一项功能,其中包含连续单个字母的文档文本字段将它们视为一个单元。如果您搜索 [ggg],您应该会找到包含三个 G 的文档。这个想法是连续的单个字母可能是首字母缩写词,应该分组。否则连续的单个字母通常不会出现在正常(英语)文本中。

不幸的是,这是一个未在开发服务器中模拟的高级功能示例。

顺便说一句,此行为对文档指定的语言敏感。例如,在法语中行为是不同的。

我们计划添加文档来阐明此功能。