Google Documents List APIでFull-text query stringしてみた

Googleドキュメントを全文検索出来るというのでどないなもんじゃい、とやってみた。


http://code.google.com/intl/ja/apis/gdata/docs/2.0/reference.html#Queries

  • When creating a query, list search terms separated by spaces, in the form q=term1 term2 term3. (As with all of the query parameter values, the spaces must be URL encoded.) The service returns all entries that match all of the search terms (like using AND between terms). Like Google's web search, a service searches on complete words (and related words with the same stem), not substrings.
  • To search for an exact phrase, enclose the phrase in quotation marks: q="exact phrase".
  • To exclude entries that match a given term, use the form q=-term.
  • The search is case-insensitive.
  • Example: to search for all entries that contain the exact phrase "Elizabeth Bennet" and the word "Darcy" but don't contain the word "Austen", use the following query: ?q="Elizabeth Bennet" Darcy -Austen

とあるので適当にPython用に用意されてるクライアント用ライブラリを使って*1認証した*2gdata.docs.serviceモジュールのDocsServiceクラスのGetDocumentListFeedメソッドで試してみた。


認証はライブラリに一緒に付いてくるサンプルコードのを見たい方が分かりやすのでとりあえず省略。

feed = gdocs.GetDocumentListFeed('http://docs.google.com/feeds/documents/private/full/?q=%e3%81%ae')
#gdocsはDocsServiceクラスのインスタンスです
print feed.ToString()

こんな感じでとりあえずGoogleドキュメントの全てのファイルのフィードが見れる。
GetDocumentListFeedメソッドにフィードのURIを渡すとそのそのフィードのラッパクラスのインスタンス?みたいなものが返ってくる。この時に渡すURIはURLエンコードされてないといけない。
で、そのクラスのToStringメソッドを使ってやるとフィードのXMLが文字列で返ってくる。*3
このソースではよく使われる助詞だろうということで、ひらがなの「の」で検索している。


結果、Googleドキュメントで作ったファイルに関してはすべて返ってきたフィードに含まれていた。
しかし、Wordで作った.docファイルは検索に引っかからなかったようだ*4しかし、何故か「ダウンロードについて.pdf」という「の」がひとつも含まれていないファイルまで引っかかっていた、この辺については謎である。どうやら、文書の中身まで検索しているようだ。


これはいいとして、ちょっと不便なところがある。
例えば、「Pythonでなんやかんや」というファイル名のファイルがあったときに
Python」だと検索に引っかかるが、「thon」だと引っかからない。
どうやら、Googleドキュメント側で形態素解析をして検索しているようだ。
そのくせして「Py」だと引っかかるので前方一致なら問題ないらしい。
それでも、この検索機能はかなり使えそうだ。


ちなみにこの記事はいい加減に書いたものなので、間違っている所とか有るかもしれません。
何か有りましたらコメントのほうで指摘をお願いします。

*1:http://code.google.com/intl/ja/apis/gdata/docs/client-libraries.html

*2:ちなみに自分はGAEを使ってOAuth認証しているがアカウントとパスワードを直接ソースコードに書いて認証も出来る

*3:このXMLは改行されてないのでtoprettyxmlでも使って整形しておくといいかもしれない

*4:このあたりはしかたないだろう