我一直在https://developers.google.com/appengine/docs/java/search/overview上关注有关Google Search API的教程。我发现的信息非常清楚如何构建文档并将其加载到索引中。我不确定如何将数据存储区数据加载到文档中。
试图实现的是对几个字段进行简单的%LIKE%查询。例如,我正在开发音乐库。如果用户键入“glory”,那么我想使用Search API返回标题中某处带有“glory”的所有实体。我已经通过将搜索文本添加到“\ uFFFD”来实现“开头为”的解决方法,但是,我发现这样做不够。我的用户将是一个新手,并且如果他们不必像传统搜索中那样选择字段,这也将有所帮助。因此,全文搜索似乎是解决方案。
这是我的问题:
for(ScoredDocument scoredDocument:results){
//处理scoredDocument
有没有人举例说明存储文档的内容?正是我们输入的内容,还是您必须再次标识每个字段?还是处理ScoredDocument返回数据存储区实体的示例?
如果有人可以帮我填补这些空白,我将不胜感激。
谢谢您和我一起看这个。
最佳答案
试图实现的是对几个字段进行简单的%LIKE%查询
为了实现此目的,您需要“标记化”您的记录名称,GAE提供了全文搜索,因此为了获得部分匹配,您需要为每条记录添加部分匹配,因此:
如果记录的名称是“荣耀”,则应添加“G”,“GL”,“Glo”,“荣耀”,“y”,“ry”,“ory”,“lory”的标记
这是我用来提供部分搜索结果的非常基本的实现(仅适用于“开始于”而不实现“结束于”)
public void addField(String name, String value, boolean tokenize) {
addField(Field.newBuilder().setName(name).setText(value));
if (tokenize) {
for (int i = startTokenIndex ; i < value.length() ;i++) {
addField(Field.newBuilder().setName("token" + (lastTokenIndex++))
.setText(value.substring(0, i)));
}
}
}
我的数据存储区中的每个记录都应该是一个文档吗?
是。您甚至可以将文档ID与实体的数据存储区ID进行匹配,以进行快速匹配。 (或者您可以将其添加为单独的字段)
我想返回整个数据存储区实体(只有8
字段)作为我实体类型的Iterable。我们指定每个
字段我们需要返回吗?
您需要将实体的ID存储在文档中,这样,当您的搜索返回一组文档时,您只需检索具有这些ID的所有实体。
有没有人举例说明存储文档的内容?
正是我们输入的内容,还是您必须再次标识每个字段?要么
处理ScoredDocument返回数据存储区的示例
实体?
文档返回您存储在其中的所有字段,以及大量数据,例如评分,ID等。在您的情况下,“处理”将包括从文档中获取实体ID。
如果您确定您的记录不会超过1000,那么您几乎可以将所有内容存储在搜索索引中。请记住,索引不是为此而设计的,并且在扩展时将面临一些严重的限制,而数据存储显然不会这样做。