我注意到AppEngine的“生产”全文搜索功能的奇怪行为:
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
在“生产”App Engine上的JSP中运行相同的东西只产生:
name (TEXT): Kenny G
name (TEXT): G Money
请注意,不会返回字段值为“G G”(或“G G G”)的文档。
索引的最小字段长度是否有书面限制?显然,令牌化接受单个字符的标记或“Kenny G”示例将失败。非常令人费解和看起来像一个潜在的错误,但也许我错过了记录的东西。
答案 0 :(得分:1)
生产服务器实现一项功能,其中包含连续单个字母的文档文本字段将组作为一个单元处理。如果您搜索[ggg],您应该找到具有三个G的文档。这个想法是连续的单个字母可能是一个缩写,应该分组。否则连续的单个字母通常不会出现在普通(英语)文本中。
不幸的是,这是一个未在devserver中模拟的高级功能的示例。
顺便说一句,此行为对文档指定的语言很敏感。例如,在法语中,行为是不同的。
我们计划添加文档以澄清此功能。