這很嗆,查詢太大了。考慮使用多查詢,朋友查詢的LIMIT和一些OFFSET來遍歷數據。
fql?q={"friendsquery":"SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET 0","linkquery": "SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM #friendsquery) AND (strpos(lower(summary),'boston') >=0 OR strpos(lower(owner_comment),'boston') >=0) LIMIT 20"}
該電流查詢會在80秒爲400
這裏的朋友列表是Python的一個例子,它不是PHP,但API的實現是一樣的
from facepy import GraphAPI
import time
import urllib
import json
fb_dump = open('dumpfb.txt', 'w')
graph = GraphAPI('MY_ACCESS_TOKEN')
all_posts = []
offset = 0
friendsquery = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '+ str(offset)
linksquery = 'SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM #friendsquery) AND (strpos(lower(summary),"trinidad") >=0 OR strpos(lower(owner_comment),"trinidad") >=2) LIMIT 20'
t0 = time.time()
try:
my_posts = graph.fql({'friendsquery': friendsquery, 'linksquery': linksquery})
while my_posts["data"][0]["fql_result_set"]:
all_posts = all_posts + my_posts["data"]
offset = offset + 20
friendsquery = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '+ str(offset)
my_posts = graph.fql({'friendsquery': friendsquery, 'linksquery': linksquery})
t1 = time.time()
print t1-t0
fb_dump.write(json.dumps(all_posts, indent=4))
except GraphAPI.OAuthError, e:
print e.message
執行批量查詢可以將查詢縮短到25秒。速度不是很快,但比前兩個查詢快。我沒有做它在PHP,但你應該得到的要點
這是在一個批處理和一個/我的/朋友來電
fb_dump = open('lumpfb.txt', 'w')
graph = GraphAPI('MY_ACCESS_TOKEN')
all_posts = []
offset = 0
friendsquery = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '
linksquery = 'SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM #friendsquery) AND (strpos(lower(summary),\'trinidad\') >=0 OR strpos(lower(owner_comment),\'trinidad\') >=2) LIMIT 20'
t0 = time.time()
batch_request = []
try:
my_friends = graph.get("me?fields=friends")
counter = len(my_friends["friends"]["data"])
while counter > 0 :
friendsquery0 = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '+ str(offset)
the_query = '{"friendsquery":"'+friendsquery0+'","linksquery":"'+linksquery+'"}'
batch_item = {"method":"GET","relative_url":"fql?q=" + the_query}
batch_request.append(batch_item)
offset = offset + 20
counter = counter - 20
my_posts = graph.batch(batch_request)
for post in my_posts:
all_posts = all_posts + post['data']
t1 = time.time()
print t1-t0
except facepy.exceptions.FacepyError, e:
print e.message
好了20多查詢,所以你說我有限制那麼搜索的朋友的數量,因爲通過所有關閉他們太多? –
@DevinDixon您限制**每**查詢。在此之後的下一個查詢將有朋友查詢作爲選擇uid2從朋友在哪裏uid1 =我()極限20 ** OFFSET 20 ** – phwd
好吧,我明白了。我的限制似乎是50.這個答案我想標記爲一半正確的,因爲雖然未知錯誤的問題不再存在,但解決方案效率非常低。與Twitter不同的是,Facebook的搜索似乎普遍存在。 –