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

Owe*_*son 5 python google-app-engine full-text-search

这是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)替换获得了最好的结果,但是>,<,> =和<=继续无法从索引中产生预期的结果.此外,这似乎与转义问题没有任何关系,但NOTfield = value类型查询前使用似乎也不像广告中那样工作.

TL;博士

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

Seb*_*eft 3

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

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

import string
from google.appengine.api.search import Query
Query('"%s"' % string.printable.replace('"', '').replace('\\', ''))
Run Code Online (Sandbox Code Playgroud)

你甚至可以传递不可打印的字符

Query('"%s"' % ''.join(chr(i) for i in xrange(128)).replace('"','').replace('\\', ''))
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,用双引号括起来的任何内容都是完全匹配的,即“foo bar”将与 ...foo bar... 匹配,但不会与 ...bar foo..

  • 好吧,我开始明白了。这确实是上下文相关的(正如我在小组帖子中提到的)。`foo &gt;= 123` 无需干预即可工作,但 `foo &gt;= 123 &gt; ` 将引发异常。看来我需要构建一个预解析器解析器才能完全处理这个问题。这……太尴尬了。 (2认同)