这是14讨论的交叉帖子
我正在使用gae 1.6.6中的新全文搜索服务,在将查询字符串传递到搜索索引之前,我很难弄清楚如何正确地转义查询字符串。文档提到需要转义某些字符(即数值运算符),但是它们没有指定查询解析器期望如何转义字符串。
我面临的问题是两方面的:
QueryException。我设置了一个测试,将string.printable输入到my_index.search()中,并发现它会在每个“可打印”的控制字符上提高QueryException,而我现在正在去掉这些字符,以及看起来无害的东西,比如星号、逗号、括号、大括号、倾斜字符。这些在文档中都没有提到需要转义。
到目前为止,我已经尝试过:
cgi.escape()saxutils.escape() (如, -> %2C)saxutils.escape() (例如{)urllib.quote_plus()到目前为止,我使用url样式(%NN)替换已经得到了最好的结果,但是>、<、>=和<=仍然无法从索引中获得预期的结果。而且,这似乎与转义问题没有任何关系,但在NOT类型查询前面使用field = value似乎也不像所宣传的那样有效。
tl;dr
在将查询发送到搜索服务之前,我应该如何转义查询,以便解析器不会引发QueryException,并且我的查询会产生预期的结果?
发布于 2012-05-24 18:28:40
正如在文献资料中简要解释的那样,查询参数是一个字符串,应该符合我们的查询语言。我们应该更好地记录。
现在,我建议您将查询(或至少一些单词/术语)用双引号包装。这样,您就可以传递所有可打印的字符,但是传递"和\。下面的示例显示了结果。
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 foo。
https://stackoverflow.com/questions/10741011
复制相似问题