【问题标题】:Escaping search queries for Google's full text search service转义 Google 全文搜索服务的搜索查询
【发布时间】:2019-10-04 18:06:02
【问题描述】:

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

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

我遇到的问题有两个:

  1. 如果无法从许多字符中逃脱(超过文档中暗示的字符)将导致解析器引发 QueryException
  2. 当我将查询转义到它不会引发的点时,数字运算符(>、=、

我设置了一个测试,将 string.printable 输入到 my_index.search() 中,发现它会在每个“可打印”控制字符上引发 QueryException看起来像星号,逗号,括号,大括号,波浪号一样无辜。这些都没有在文档中提到需要转义。

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

  • cgi.escape()
  • saxutils.escape() 将 ascii 映射到 urlencoded 等效项(例如 , -> %2C
  • saxutils.escape() 带有 ascii 到 html 实体编码的 ascii 代码的映射(例如 {
  • urllib.quote_plus()

到目前为止,我使用 url-style(%NN) 替换获得了最好的结果,但是 >、= 和 field = value 类型查询前面使用 NOT 似乎也不能像宣传的那样工作。

tl;博士

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 能否提供一个更实际的例子?给定一个类似created >= 2009-20-13 AND description:foobar 的查询,你会如何逃避它?
    • 您提供的查询不需要转义 Query('created >= 2009-20-13 AND description:foobar') 工作正常。如果您实际上是在文档中查找字符串“created >= 2009-20-13 AND description:foobar”,则应将该字符串括在引号中。但作为一项规则,如果我想将文档中定义的任何运算符用作字符而不是运算符,我会将它们括在双引号中。
    • 好的,我开始看。这确实是上下文相关的(正如我在我的小组帖子中提到的那样)。 foo >= 123 无需干预即可工作,但 foo >= 123 > 会引发异常。看来我需要构建一个预解析器解析器才能完全处理这个问题。这……很尴尬。
    • 此答案通过删除可能实际上是查询一部分的任何双引号来更改原始搜索词。相反,我成功地使用了以下替换,它只是转义了搜索词中的任何双引号:search_term.replace('"', '\\"')
    • 这个答案可以追溯到 2012 年,并提到“现在”。现在有没有更好的方法来做到这一点?用引号括起来不是一个理想的解决方案,因为它会寻找确切的字符串
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2012-12-16
    相关资源
    最近更新 更多