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

试图实现的是对几个字段进行简单的%LIKE%查询。例如,我正在开发音乐库。如果用户键入“glory”,那么我想使用Search API返回标题中某处带有“glory”的所有实体。我已经通过将搜索文本添加到“\ uFFFD”来实现“开头为”的解决方法,但是,我发现这样做不够。我的用户将是一个新手,并且如果他们不必像传统搜索中那样选择字段,这也将有所帮助。因此,全文搜索似乎是解决方案。

这是我的问题:

  • 我的数据存储区中的每个记录都应该是一个文档吗?还是将所有记录合并为一个文档?我的固定数据存储区大小只有1000条记录。谁能提供正确方法的示例?
  • 我想以实体类型的Iterable返回整个数据存储区实体(只有8个字段)。我们是否指定需要返回的每个字段?该示例仅说明:

    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,那么您几乎可以将所有内容存储在搜索索引中。请记住,索引不是为此而设计的,并且在扩展时将面临一些严重的限制,而数据存储显然不会这样做。

    07-28 03:00
    查看更多