这是https://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussion
的交叉发布我正在使用gae 1.6.6中的新全文搜索服务,而且在将其传递给搜索索引之前,我无法弄清楚如何正确地转义我的查询字符串。文档提到某些字符需要被转义(即numeric operators),但是它们没有指定 查询解析器期望字符串被转义。
我遇到的问题有两个方面:
QueryException
。我设置了一个测试,我将string.printable
提供给my_index.search()
,发现它会在每个“可打印”控制字符上引发QueryException
,我现在正在剥离它,以及像星号,逗号,括号,大括号,波浪形似乎无辜的东西。文档中没有提到这些都需要转义。
到目前为止,我已经尝试过:
cgi.escape()
saxutils.escape()
,其中包含ascii到urlencoded等效的映射(例如,
- > %2C
)saxutils.escape()
,其中包含ascii到html实体编码的ascii代码的映射(例如{
)urllib.quote_plus()
到目前为止,我已经使用url-style(%NN
)替换获得了最好的结果,但>,<,> =和< =继续无法从中获得预期的结果指数。
此外,这似乎与转义问题无关,但在NOT
类型查询前使用field = value
似乎也没有像宣传的那样工作。
在将查询发送到搜索服务之前,我应该如何逃避查询,以便解析器不会引发QueryException
并我的查询会产生预期结果?
答案 0 :(得分:3)
如文档(https://developers.google.com/appengine/docs/python/search/overview#Query_Language_Overview)中简要解释的那样,查询参数是一个符合我们查询语言的字符串。我们应该更好地记录。
目前,我建议您用双引号将查询(或至少一些单词/术语)包装起来。通过这种方式,您可以传递所有可打印的字符,但“和。以下示例显示结果。
import string
from google.appengine.api.search import Query
Query('"%s"' % string.printable.replace('"', '').replace('\\', ''))
你甚至可以传递不可打印的字符
Query('"%s"' % ''.join(chr(i) for i in xrange(128)).replace('"','').replace('\\', ''))
修改强>: 请注意,用双引号括起来的任何内容都是精确匹配,即“foo bar”会匹配... foo bar ...但是没有... bar foo ..