Атрибут множественного выбора не индексирует CE 2.6.1
Я перенес свой сайт с 1.9x на 2.6.1. У меня есть по крайней мере 2 атрибута множественного выбора, которые не индексируются в catalog_product_index_eav. Исследуя эту проблему, я обнаружил, что если для eav_attribute.backend_type установлено значение varchar, я должен увидеть его в catalog_product_entity_varchar. Его там нет, но я нашел его в catalog_product_entity_text.
Я обнаружил эту проблему, выполнив расширенный поиск и поняв, что, когда я выбрал один из нескольких вариантов выбора атрибуты для поиска, результаты не найдены. Они действительно работают на моем сайте 1.9x. Я проверил все настройки атрибутов. Я даже создал новый атрибут множественного выбора в качестве теста, и это отлично работает. Я даже вручную добавил нерабочий атрибут в таблицу catalog_product_index_eav, а затем поиск мог его найти.
Итак, я ищу больше способов отладки или других вещей, чтобы проверить, почему он не индексируется в catalog_product_index_eav.
Спасибо
2 answers
Я смог изменить эти сценарии, чтобы устранить мою проблему: https://dev98.de/2017/01/19/fixing-issues-after-changing-product-attribute-type-from-varchar-to-text/
Первое, что я сделал, это изменил свои атрибуты с text на varchar в таблице eav_attribute. Затем я запустил следующий sql
UPDATE catalog_product_entity_varchar, catalog_product_entity_text
SET catalog_product_entity_varchar.value = catalog_product_entity_text.value
WHERE catalog_product_entity_varchar.attribute_id =
catalog_product_entity_text.attribute_id
AND catalog_product_entity_varchar.entity_id =
catalog_product_entity_text.entity_id
AND catalog_product_entity_text.store_id =
catalog_product_entity_varchar.store_id
AND catalog_product_entity_varchar.value is null
AND catalog_product_entity_text.attribute_id = {attribute_id};
INSERT IGNORE INTO catalog_product_entity_varchar
(store_id, attribute_id, entity_id, value)
select store_id, attribute_id, entity_id, value
from catalog_product_entity_text
where catalog_product_entity_text.attribute_id = {attribute_id};
and catalog_product_entity_text.value is not null;
DELETE FROM catalog_product_entity_text where attribute_id = {attribute_id};
После этого я переиндексировал, и все было исправлено.
Вот мое аналогичное решение sql, которое может быть немного более понятным и простым в изменении для ваших нужд:
-- View the attributes to verify what we are changing
SELECT * FROM shm2_eav_attribute WHERE frontend_input = 'multiselect' AND entity_type_id = 4
-- Update them to varchar
UPDATE shm2_eav_attribute SET backend_type = 'varchar' WHERE frontend_input = 'multiselect' AND entity_type_id = 4
-- Copy the values from the text table to the varchar table
INSERT IGNORE INTO shm2_catalog_product_entity_varchar
SELECT NULL, attribute_id, store_id, VALUE,row_id
FROM shm2_catalog_product_entity_text
WHERE attribute_id
IN (SELECT attribute_id FROM shm2_eav_attribute WHERE frontend_input = 'multiselect' AND entity_type_id = 4)
-- Remove them from the text table
DELETE FROM shm2_catalog_product_entity_text
WHERE attribute_id IN (SELECT attribute_id FROM shm2_eav_attribute WHERE frontend_input = 'multiselect' AND entity_type_id = 4)