3

我一直在关注https://developers.google.com/appengine/docs/java/search/overview上有关 Google 搜索 API 的教程。我找到的信息非常清楚如何构建文档并将其加载到索引中。我不确定如何将数据存储数据加载到文档中。

我试图实现的是对几个字段的简单 %LIKE% 查询。例如,我正在开发一个音乐库。如果用户输入“荣耀”,那么我想使用搜索 API 返回标题中某处带有“荣耀”的所有实体。我已经通过将搜索文本添加到“\uFFFD”来实现“开始于”工作,但是,我发现这还不够。我的用户将是非常新手,如果他们不必像在传统搜索中那样选择字段,这也会很有帮助。所以全文搜索似乎是解决方案。

以下是我的问题:

  1. 我的数据存储中的每条记录都应该是一个文档吗?还是将所有记录合并到一个文件中?我有一个相当固定的数据存储大小,只有 1000 条记录。任何人都可以提供正确方法的示例吗?

  2. 我想将整个数据存储实体(它只有 8 个字段)作为我的实体类型的 Iterable 返回。我们是否指定了需要返回的每个字段?这个例子只是说:

    for (ScoredDocument scoreDocument : results) { // 处理 scoreDocument }

有没有人有存储文档的示例?这正是我们输入的内容,还是您必须再次识别每个字段?还是处理返回数据存储实体的 ScoredDocument 的示例?

如果有人可以帮我填写这些空白,我将不胜感激。

谢谢你和我一起看这个。

4

1 回答 1

0

我试图实现的是对几个字段的简单 %LIKE% 查询

为了实现这一点,您需要“标记”您的记录名称,GAE 提供了全文搜索,因此为了让您获得部分匹配,您需要为每条记录添加部分匹配:

如果您的记录名称是“Glory”,您应该添加“G”、“Gl”、“Glo”、“Glor”、“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 条,您可以将所有内容都存储在搜索索引中。请记住,索引不是为此而设计的,并且在扩展时会面临一些严重的限制,而数据存储显然不会。

于 2015-03-24T18:56:35.523 回答