Работаю с поисковым движком Sphinx (он же sphinxsearch). При SphinxQL-запросе Сфинкс выдаёт ошибку «ERROR 1064 (42000): no such filter attribute».
Разберёмся в природе этой проблемы. Для начала представлю свои данные.
Таблица:
[sql]
CREATE TABLE IF NOT EXISTS `organizations` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`description` text,
`address` varchar(255) NOT NULL,
`city_id` int(10) unsigned NOT NULL,
`cat_id` int(10) unsigned NOT NULL,
`url` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ix2` (`url`),
KEY `ix3` (`cat_id`),
KEY `ix4` (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
[/sql]
Конфиг Sphinx для поиска по вышеописанной таблице:
source organizations { type = mysql sql_host = localhost sql_user = root sql_pass = root_pass sql_db = db_title sql_port = 3306 # optional, default is 3306 sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query = SELECT * FROM `organizations` sql_attr_uint = id sql_query_info = SELECT * FROM organizations WHERE id=$id } index organizations { source = organizations path = /var/www/data/www/sphinx/data morphology = stem_ru min_word_len = 1 charset_type = utf-8 } indexer { mem_limit = 128M } searchd { listen = /var/www/data/www/sphinx/searchd.sock:mysql41 log = /var/www/data/www/sphinx/searchd.log pid_file = /var/www/data/www/sphinx/sphinx.pid }
Всё проиндексировал и запустил. Пишу к Сфинксу такой запрос на SphinxQL:
[sql]
SELECT * FROM organizations WHERE MATCH(‘some_org’) AND city_id = 10 ORDER BY id DESC LIMIT 10;
[/sql]
Sphinx (sphinxsearch) выдаёт ошибку:
ERROR 1064 (42000): index organizations: no such filter attribute 'city_id' sql_attr_uint = city_id
Что делать, как исправить, что бы работало как задумано в запросе?
Решение проблемы
Sphinx не может отбирать данные по тем атрибутам, которых он не знает. Поле city_id
используется в запросе как фильтр, но оно не задано в конфигурационном файле Sphinx как фильтр.
Атрибуты (столбцы таблицы), которые можно использовать в качестве фильтров надо указывать следующим образом в секции source:
sql_attr_uint = category_id sql_attr_timestamp = created_at sql_attr_float = cb_commission sql_attr_multi = uint cb_category from query; SELECT id, category_id FROM clickbank_category_bind
Т.е. по типу поля выбирается соответствующая директива конфигурации Sphinx.
Конкретно в моём случае в секцию source надо дописать:
sql_attr_uint = city_id
В конечном счёте вся секция будет выглядеть так:
source organizations { type = mysql sql_host = localhost sql_user = root sql_pass = root_pass sql_db = db_title sql_port = 3306 # optional, default is 3306 sql_query_pre = SET NAMES utf8 sql_query_pre = SET CHARACTER SET utf8 sql_query = SELECT * FROM `organizations` sql_attr_uint = id sql_attr_uint = city_id #дописан атрибут (столбец таблицы), который можно использовать в качестве фильтра sql_query_info = SELECT * FROM organizations WHERE id=$id }
После этого необходимо перестроить индекс Sphinx, т.е. запустить indexer с нужными параметрам передавая файл конфига. После этого запустить поисковый демон Сфинкса (searchd).