6

这是https://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussion的交叉帖子

我正在使用 gae 1.6.6 中的新全文搜索服务,但在将查询字符串传递给搜索索引之前,我无法弄清楚如何正确转义查询字符串。文档提到某些字符需要转义(即数字运算符),但是它们没有指定查询解析器如何期望字符串被转义。

我遇到的问题有两个:

  1. 未能从许多字符中逃脱废话(比文档中暗示的更多)将导致解析器引发QueryException.
  2. 当我将查询转义到它不会引发的程度时,数字运算符(>、<、>=、<=)不再正确解析(不考虑到搜索中)。

我设置了一个测试,我string.printable输入my_index.search()并发现它会QueryException在每个“可打印”控制字符上引发,我现在将其剥离,以及星号、逗号、括号、大括号、波浪号等看似无辜的东西. 这些都没有在文档中提到需要转义。

到目前为止,我已经尝试过:

  • cgi.escape()
  • saxutils.escape()将 ascii 映射到 urlencoded 等价物(例如,-> %2C
  • saxutils.escape()将 ascii 映射到 html 实体编码的 ascii 代码(例如&#123;
  • urllib.quote_plus()

到目前为止,我使用 url-style( %NN) 替换获得了最好的结果,但是 >、<、>= 和 <= 仍然无法从索引中产生预期的结果。此外,这似乎与转义问题没有任何关系,但NOT在类型查询前面使用field = value似乎也没有像宣传的那样工作。

tl;博士

我应该如何在将查询发送到搜索服务之前对其进行转义,以便解析器不会引发QueryException 并且我的查询会产生预期的结果?

4

1 回答 1

3

正如文档中的简要说明,查询参数是一个字符串,应该符合我们的查询语言。我们应该更好地记录。

现在,我建议您将查询(或至少一些单词/术语)用双引号括起来。这样你就可以传递所有可打印的字符,但是"\. 以下示例显示了结果。

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..

于 2012-05-24T18:28:40.573 回答