【问题标题】:google app engine search API: works hardcoded but not with variablegoogle app engine search API:硬编码但不使用变量
【发布时间】:2015-02-04 20:23:07
【问题描述】:

我有一个带有 GeoField 和 NumberField 的文档,如下所示:

document = search.Document(doc_id=str(self.id),
                               fields=[search.GeoField(name='loc',value=search.GeoPoint(20.0, 30.0)),
                                       search.NumberField(name='maxradius', value=10)])
search.Index(name='Professional').put(document)

当我查询时:

query = "distance(loc, geopoint(20.0, 30.0)) < 10"

我得到正确的结果 但是当我查询时:

query = "distance(loc, geopoint(20.0, 30.0)) < maxradius"

我收到RuntimeError: ValueError('could not convert string to float: maxradius',)

发生了什么,有什么想法吗?

【问题讨论】:

标签: python google-app-engine google-search-api


【解决方案1】:

所引发的错误表明 maxradius 被视为字符串,无法转换为错误消息中指定的浮点数,然后如前所述,您需要动态设置此变量。您可以尝试这种方式,注意动态注入的单引号而不是双引号:

query = 'distance(location, geopoint(20.0, 30.0)) < %d' % maxradius

希望对你有帮助!

【讨论】:

  • 我的意思是,就像每个文档中的位置不同一样,我需要最大半径不同。
  • maxradius 表示给定业务获取客户的最大距离,每个业务都可以设置自己的最大半径。
【解决方案2】:

你想要的是这样的:

maxradius = 10
query = "distance(loc, geopoint(20.0, 30.0)) < " + maxradius

编辑:

尝试这样的事情(不完全像这样):

query = "distance(loc, geopoint(20.0, 30.0)) < "
for i in range(10):
    do_something(query + i)

这将为您提供 10 个不同的查询字符串。您可以将其切换并使其遍历预定义值列表,例如:

maxradius = [1, 5, 23, 6, 2, 1, 77]
query = "distance(loc, geopoint(20.0, 30.0)) < "
for i in maxradius:
    do_something(query + i)

这就是您可以为每个文档设置不同的最大半径的方法

【讨论】:

  • 不,我想为每个文档设置不同的最大半径。这对我不好。
  • 那么您可以在一个简单的 for 循环中调整 maxradius 变量。这里重要的一点是将原始查询设为“distance(loc, geopoint(20.0, 30.0)) &lt; ”,然后添加变量(将转换为字符串)
  • 我不知道你想要什么。你问了一个问题,现在你有两个有效的答案。不要抱怨我们没有回答你的问题。我们都修复了 python 运行时错误。我建议你看一些these,这样你就可以理解一些基本的编程思想,然后也许再问一个不同的问题。
  • 我没有抱怨,感谢您抽出宝贵的时间来回答。您的建议确实解决了错误,但未能实现目标。如果我想对我的查询进行持续注入,我就不会费心问这个问题。我的项目的想法是根据双方的位置提供企业客户,而提供太远的企业客户,因此每个企业都设置了自己的最大半径。您的建议为每个人提供了一个最大半径的解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多