Страница поиска fql Facebook с strpos не работает? - PullRequest
1 голос
/ 08 сентября 2011

Почему этот запрос:

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 ]

2 голосов
/ 08 сентября 2011

Вы не можете использовать функции FQL в предложении WHERE.Это означает, что базе данных придется выполнять вычисления для каждой строки в таблице, а не использовать индекс, который в случае Facebook представляет собой довольно большую базу данных, проходящую через каждую строку ...

2 голосов
/ 09 сентября 2011

Использование операторов strpos & lower в предложении WHERE делает их не индексируемыми.

В приведенном выше примере:

SELECT name
FROM user
WHERE uid IN (
    SELECT uid2
    FROM friend
    WHERE uid1=me()
)
AND strpos(lower(name),"jo") >=0

Это работает, потому что вы используете индексируемое поле uid . Вы можете использовать strpos & lower для некоторого подмножества данных, которое у вас уже есть с индексируемым полем.

В вашем примере у вас нет индексируемого поля, поэтому отображается ошибка.

Вы можете достичь того же результата, используя Graph API , например:

https://graph.facebook.com/search?q=coca&type=page
0 голосов
/ 08 сентября 2011

Поля индексируются, но вы ищете производные полей - значения функции lower () вычисляются при каждом запуске запроса, поэтому не индексируются. Вы, вероятно, можете обмануть FB, разрешив его, добавив еще одно предложение, работающее с необработанным полем:

WHERE strpos(lower(name), lower('coca')) >= 0 OR (name < 0)
                                             ^^^^^^^^^^^^^
...