为什么这个查询:
SELECT name, page_id from page WHERE strpos(lower(name),lower('coca')) >= 0
返回此错误
“error_code”:604,“error_msg”:“您的语句不可索引。 WHERE子句必须包含可索引的列。这样的列是 在链接的表格中标有* http://developers.facebook.com/docs/reference/fql“
然而在Fql doc中写道:
page_id
& name
字段是Indexables
以及此查询的工作原理?我知道这不在页面表上,但是
SELECT name
FROM user
WHERE uid IN (
SELECT uid2
FROM friend
WHERE uid1=me()
)
AND strpos(lower(name),"jo") >=0
答案 0 :(得分:2)
您不能在WHERE
子句中使用FQL函数。这样做意味着数据库必须对表中的每一行进行计算,而不是使用索引,在Facebook的情况下,这是一个非常大的数据库,需要遍历每一行......
答案 1 :(得分:2)
使用 strpos & WHERE子句中的 lower 运算符使它们不可索引。
在上面的示例中:
SELECT name
FROM user
WHERE uid IN (
SELECT uid2
FROM friend
WHERE uid1=me()
)
AND strpos(lower(name),"jo") >=0
它的工作原理是因为您使用了可索引字段 uid 。 您可以使用 strpos & 降低您已拥有可转位字段的某些数据子集。
在您的示例中,您没有可转位字段,因此显示错误。
您可以使用图谱API 来实现相同的结果:
https://graph.facebook.com/search?q=coca&type=page
答案 2 :(得分:0)
字段是可索引的,但您正在搜索字段的派生 - 每次运行查询时都会计算lower()函数的值,因此不会编制索引。您可以通过添加另一个在原始字段上运行的子句来欺骗FB以允许它:
WHERE strpos(lower(name), lower('coca')) >= 0 OR (name < 0)
^^^^^^^^^^^^^