对谷歌全文搜索服务的退出搜索查询

2024-10-01 15:49:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我面临的问题有两个方面:

  1. 如果不能从许多字符(超过文档中暗示的字符)中转义,将导致解析器产生一个QueryException。在
  2. 当我将查询转义到它不会引发的位置时,数值运算符(>;、<;、>;=、<;=)将不再正确解析(不会在搜索中考虑)。在

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

到目前为止,我尝试过:

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

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

tl;dr

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


Tags: 字符串文档httpsltgt解析器url编码
1条回答
网友
1楼 · 发布于 2024-10-01 15:49:35

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

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

import string
from google.appengine.api.search import Query
Query('"%s"' % string.printable.replace('"', '').replace('\\', ''))

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

^{pr2}$

编辑: 注意,用双引号括起来的任何东西都是完全匹配的,即“foo bar”将与…foo bar匹配。。。但不是…酒吧。。在

相关问题 更多 >

    热门问题