Python 谷歌应用程序引擎搜索API:使用硬编码但不使用变量
我有一个带有地理域和数字域的文档,如下所示:Python 谷歌应用程序引擎搜索API:使用硬编码但不使用变量,python,google-app-engine,google-search-api,Python,Google App Engine,Google Search Api,我有一个带有地理域和数字域的文档,如下所示: document = search.Document(doc_id=str(self.id), fields=[search.GeoField(name='loc',value=search.GeoPoint(20.0, 30.0)), search.NumberField(name='maxradius', v
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=“距离(loc,地质点(20.0,30.0))<10”
我得到的结果是正确的
但当我提出疑问时:
query = "distance(loc, geopoint(20.0, 30.0)) < maxradius"
query=“距离(loc,地质点(20.0,30.0))
我得到RuntimeError:ValueError('无法将字符串转换为float:maxradius',)
发生了什么事,有什么想法吗 您想要的是:
maxradius = 10
query = "distance(loc, geopoint(20.0, 30.0)) < " + maxradius
maxradius=10
query=“距离(loc,地质点(20.0,30.0))<”+最大半径
编辑:
尝试这样的方法(不完全像这样):
query=“距离(loc,地质点(20.0,30.0))<”
对于范围(10)内的i:
做某事(查询+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)
maxradius=[1,5,23,6,2,1,77]
query=“距离(loc,地质点(20.0,30.0))<”
对于maxradius中的i:
做某事(查询+i)
这就是如何为每个文档设置不同的最大半径的方法。引发的错误表明,maxradius被视为字符串,无法转换为错误消息指定的浮点值,然后如上所述,您需要动态设置此变量。您可以这样尝试,请注意要动态注入的单引号而不是双引号:
query = 'distance(location, geopoint(20.0, 30.0)) < %d' % maxradius
query='距离(位置,地质点(20.0,30.0))<%d'%maxradius
希望有帮助 不,我想为每个文档使用不同的maxradius。这对我不好。那么你可以在一个简单的for循环中调整
maxradius
变量。这里最重要的一点是将原始查询设置为距离(loc,geopoint(20.0,30.0))<”,然后添加变量(将转换为字符串),我不知道您想要什么。你问了一个问题,现在你有了两个有效的答案。不要抱怨我们没有回答你的问题。我们都修复了python运行时错误。我建议你看看其中的一些,这样你就可以理解一些基本的编程思想,然后再问一个不同的问题。我不是在抱怨,我感谢你抽出时间回答。你的建议确实解决了错误,但没有达到目标。如果我想不断地向我的查询注入信息,我就不会费心问这个问题了。我的项目的想法是根据两个公司的位置为公司提供客户,而不是为距离太远的公司提供客户,因此每个公司都设置自己的maxradius。您的建议为每个人提供了一个maxradius解决方案。我的意思是,就像每个文档中的位置不同一样,我需要maxradius不同。maxradius表示为给定业务吸引客户的最大距离,每个企业都可以设置自己的maxradius。我怀疑在当前的AppEngine搜索API中无法做到这一点。有关文档,请参阅,尽管它没有明确说明这一点。我认为您应该使用一个较大的固定maxradius(例如100km/10000m),然后将距离作为查询选项中指定的字段表达式返回,然后您必须使用每个maxradius手动筛选列表。
query = 'distance(location, geopoint(20.0, 30.0)) < %d' % maxradius