转义Google全文搜索服务的搜索查询

时间:2012-05-24 15:54:25

标签: python google-app-engine full-text-search

这是https://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussion

的交叉发布

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

我遇到的问题有两个方面:

  1. 未能逃脱许多字符的废话(超过文档中暗示的那些字符)将导致解析器引发QueryException
  2. 当我将查询转义到它不会引发的点时,数字运算符(&gt;,&lt;,&gt; =,&lt; =)不再正确解析(未在搜索中计算)。< / LI>

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

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

    • cgi.escape()
    • saxutils.escape(),其中包含ascii到urlencoded等效的映射(例如, - &gt; %2C
    • saxutils.escape(),其中包含ascii到html实体编码的ascii代码的映射(例如&#123;
    • urllib.quote_plus()

    到目前为止,我已经使用url-style(%NN)替换获得了最好的结果,但&gt;,&lt;,&gt; =和&lt; =继续无法从中获得预期的结果指数。 此外,这似乎与转义问题无关,但在NOT类型查询前使用field = value似乎也没有像宣传的那样工作。

    TL;博士

    在将查询发送到搜索服务之前,我应该如何逃避查询,以便解析器不会引发QueryException 我的查询会产生预期结果?

1 个答案:

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