Борьба с ошибкой Sphinxsearch ERROR 1064 (42000): index no such filter attribute

Работаю с поисковым движком (он же ). При SphinxQL-запросе выдаёт ошибку «ERROR 1064 (42000): no such filter attribute».

Разберёмся в природе этой проблемы. Для начала представлю свои данные.
Таблица:

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 ;

Конфиг 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:

SELECT * FROM organizations WHERE MATCH('some_org') AND city_id = 10 ORDER BY id DESC LIMIT 10;

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).

Поделиться!
Tags: , , , , , ,

49.65MB | MySQL:52 | 0,280sec