带有strpos的Facebook fql搜索页面不起作用?

时间:2011-09-08 17:43:15

标签: php facebook-fql facebook-page

为什么这个查询:

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

来源:http://www.masteringapi.com/tutorials/facebook-fql-how-to-search-partial-strings-similar-to-mysql-like-operator/27/

3 个答案:

答案 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)
                                             ^^^^^^^^^^^^^