これはhttps://groups.google.com/d/topic/google-appengine/97LY3Yfd_14/discussionのクロスポストです
gae 1.6.6の新しい全文検索サービスを使用していますが、クエリ文字列を検索インデックスに渡す前に正しくエスケープする方法を理解するのに問題があります。ドキュメントには、特定の文字(つまり、数値演算子)をエスケープする必要があると記載されていますが、クエリパーサーが文字列をエスケープする方法を指定していません。
私が抱えている問題は2つあります。
- 多くの文字(ドキュメントで示唆されている文字よりも多い)のがらくたをエスケープできないと、パーサーは。を発生させ
QueryException
ます。 - クエリをエスケープして発生しないポイントにすると、数値演算子(>、<、> =、<=)は正しく解析されなくなります(検索に考慮されません)。
テストを設定して、フィードstring.printable
すると、現在削除している「印刷可能な」制御文字のそれぞれと、アスタリスク、コンマ、括弧、中括弧、チルダなどの無実に見えるものが発生するmy_index.search()
ことがわかりました。 QueryException
。これらのいずれも、エスケープする必要があるとしてドキュメントに記載されていません。
これまでに試しました:
cgi.escape()
saxutils.escape()
アスキーをurlencoded同等物にマッピングします(例,
->%2C
)saxutils.escape()
asciiからhtmlエンティティでエンコードされたasciiコードへのマッピング(例{
)urllib.quote_plus()
これまでのところ、url-style(%NN
)の置換を使用して最良の結果が得られましたが、>、<、> =、および<=は、インデックスから期待される結果を生成できません。また、これはエスケープの問題とは実際には何の関係もないようですがNOT
、型クエリの前で使用するfield = value
ことも、宣伝どおりに機能していないようです。
tl; dr
パーサーが起動せず、クエリが期待される結果を生成するように、クエリを検索サービスに送信する前に、どのようにクエリをエスケープする必要がありQueryException
ますか?