3

我看到谷歌应用引擎现在添加了文本搜索:https ://developers.google.com/appengine/docs/python/search/overview

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

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

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

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

非常感谢!

4

2 回答 2

4

不,它没有。

我们可以搜索的唯一“通配符”是复数。

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

它可以做的是在同一个字段中保存多个令牌。在TextSearchServlet中查看他们的示例

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

因此,例如,您可以查询“nametag”字段,并假设您将名称标记到其中,得到“Mike DaSantos”

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

我对这里的成本和配额不是很清楚。

于 2012-08-11T00:36:12.237 回答
1

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

你应该只需要1。

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

于 2013-04-25T19:32:59.993 回答