谷歌应用引擎上的子串类型文本搜索

时间:2012-08-10 23:24:33

标签: google-app-engine full-text-search

我发现谷歌应用引擎现已添加了文字搜索:https://developers.google.com/appengine/docs/python/search/overview

这是否包括在字符串中搜索子字符串?

我问的原因是因为我之前写了一些代码,允许子字符串搜索名称和电话号码等字段。例如,您可以搜索“San”,它会找到“Mike DaSantos”之类的结果。这对于像auto-complete这样的东西来说太棒了。

我遇到了成本问题,因为这需要大量的写操作。我这样做的每个字段都需要大致的O((n * n + 1)/ 2)写操作,因为它涉及字符串中每个字母子集的写操作。在为6000个客户索引电话号码,姓名,电子邮件地址和地址时,这增加了几美元的应用引擎成本。

我想知道使用搜索API是否可以以更低的成本提供此功能?

非常感谢!

2 个答案:

答案 0 :(得分:4)

不,它没有。

唯一的#34;通配符"我们可以用复数搜索。

~"car"  # searches for "car" and "cars"

它可以做的是在同一个字段中保存多个令牌。请参阅TextSearchServlet

上的示例
  StringTokenizer tokenizer = new StringTokenizer(tagStr, ",");
  while (tokenizer.hasMoreTokens()) {
    docBuilder.addField(Field.newBuilder().setName("tag")
        .setAtom(tokenizer.nextToken()));
  }

所以你可以查询"名称标签"例如,假设你将名称标记到其中,得到麦克DaSantos"回

  Results<ScoredDocument> results = getIndex().search("nametag:San"); 

我对这里的成本和配额并不十分清楚。

答案 1 :(得分:1)

顺便说一句,您不应该为自己的子字符串搜索解决方案进行O((n * n + 1)/ 2)写操作。

你应该只需要1。

即,不是创建O((n * n + 1)/ 2)对象,而是在ndb.StringProperty中创建一个具有O((n * n + 1)/ 2)列表元素的对象(重复= True )