6

これはhttps://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussionのクロスポストです

gae 1.6.6の新しい全文検索サービスを使用していますが、クエリ文字列を検索インデックスに渡す前に正しくエスケープする方法を理解するのに問題があります。ドキュメントには、特定の文字(つまり、数値演算子)をエスケープする必要があると記載されていますが、クエリパーサーが文字列をエスケープする方法を指定していません。

私が抱えている問題は2つあります。

  1. 多くの文字(ドキュメントで示唆されている文字よりも多い)のがらくたをエスケープできないと、パーサーは。を発生させQueryExceptionます。
  2. クエリをエスケープして発生しないポイントにすると、数値演算子(>、<、> =、<=)は正しく解析されなくなります(検索に考慮されません)。

テストを設定して、フィードstring.printableすると、現在削除している「印刷可能な」制御文字のそれぞれと、アスタリスク、コンマ、括弧、中括弧、チルダなどの無実に見えるものが発生するmy_index.search()ことがわかりました。 QueryException。これらのいずれも、エスケープする必要があるとしてドキュメントに記載されていません。

これまでに試しました:

  • cgi.escape()
  • saxutils.escape()アスキーをurlencoded同等物にマッピングします(例,-> %2C
  • saxutils.escape()asciiからhtmlエンティティでエンコードされたasciiコードへのマッピング(例&#123;
  • urllib.quote_plus()

これまでのところ、url-style(%NN)の置換を使用して最良の結果が得られましたが、>、<、> =、および<=は、インデックスから期待される結果を生成できません。また、これはエスケープの問題とは実際には何の関係もないようですがNOT、型クエリの前で使用するfield = valueことも、宣伝どおりに機能していないようです。

tl; dr

パーサーが起動せず、クエリが期待される結果を生成するように、クエリを検索サービスに送信する前に、どのようにクエリをエスケープする必要があり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('\\', ''))

編集:二重引用符で囲まれているものはすべて完全に一致します。つまり、「foobar」は... foo bar ...と一致しますが、...barfoo.とは一致しません。

于 2012-05-24T18:28:40.573 に答える