rozwiązane
Witam
Mam następujący problem:
Integruję Magento z silnikiem Solr, muszę zastąpić domyślny mechanizm relevance na score Solarowy. Problem polega na tym, że jak już pozbyłem się zapytań kierowanych do bazy które operują na tabelach:
catalogsearch_result
catalogsearch_query
catalogsearch_fulltext
poprzez nadpisanie odpowiednich metod swoją implementacją to pojawił się problem sortowania danych. Kolekcję produktów mam nadpisaną również i działa to tak, że wyciągam z Solr'a tylko idki produktów, które spełniają kryteria wyszukiwania następnie ustawiam te idki:

  1. $this->_productsCollection->addAttributeToFilter(
  2. 'entity_id', array('in' => $product_ids)
  3. );
  4. // ...
  5. // $product_ids to idki wyciągnięte z Solra, natomiast $this->_productsCollection to moja nadpisana kolekcja (obiekt dziedziczy po Mage_CatalogSearch_Model_Mysql4_Fulltext_Collection)

następuje gdzieś dalej load() dane się pięknie wczytują, jednak przy domyślnym sortowaniu po relevance Magento się wysypuje (i nie dziwota):

Cytat
SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `e`.`name`, `e`.`price`, `e`.`small_image`, `e`.`tax_class_id`, `e`.`url_key`, `e`.`thumbnail`, `e`.`special_price`, `e`.`special_from_date`, `e`.`special_to_date`, `e`.`news_from_date`, `e`.`news_to_date`, `e`.`required_options`, `e`.`price_type`, `e`.`weight_type`, `e`.`price_view`, `e`.`shipment_type`, `e`.`image_label`, `e`.`small_image_label`, `e`.`thumbnail_label`, `e`.`frame_image`, `e`.`frame_image_label`, `e`.`bi_artstyle`, `e`.`bi_artstyle_value`, `e`.`bi_nationality`, `e`.`bi_nationality_value`, `e`.`bi_related_category`, `e`.`bi_products_count`, `e`.`bi_artists_multiverse`, `e`.`bi_artists_birth_date`, `e`.`bi_artists_death_date`, `e`.`bi_techniques`, `e`.`bi_chosen_product`, `e`.`bi_product_main_keyword`, `e`.`price`, `e`.`special_price`, `e`.`special_from_date`, `e`.`special_to_date`, `cat_index`.`position` AS `cat_index_position`, `e`.`display_price_group_0` AS `_rule_price` FROM `catalog_product_flat_1` AS `e`
INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id='1' AND cat_index.visibility IN(3, 4) AND cat_index.category_id='3' ORDER BY `relevance` asc, `e`.`created_at` asc LIMIT 32

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'relevance' in 'order clause'



Chodzi o ten order by relevance na końcu zapytania. Problem polega na tym że po stronie użytkownika musi być dostępna opcja relevance w selektorze obok pozostałych created_at, name i price. Jeśli ją wywalę to zniknie z selektora, a ja potrzebuję tylko zastąpić ten domyślny relevance moim scorem z Solra. Opcja niestety musi być i celem moim jest takie nadpisanie tego zachowania, żeby de facto relevance z bazy nie był wyciągany w ogóle (taki myk). Druga koncepcja, która niestety nie sprawdziła się, gdyż po prostu nie działa (sic!) to dodanie do zapytania aliasu 2 as relevance, co w moim przypadku załatwiłoby sprawę, ale nie hula, czyli takie coś:

  1. SELECT 1 AS `status`, 2 AS relevance, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `e`.`name`, `e`.`price`, `e`.`small_image`, `e`.`tax_class_id`, `e`.`url_key`, `e`.`thumbnail`, `e`.`special_price`, `e`.`special_from_date`, `e`.`special_to_date`, `e`.`news_from_date`, `e`.`news_to_date`, `e`.`required_options`, `e`.`price_type`, `e`.`weight_type`, `e`.`price_view`, `e`.`shipment_type`, `e`.`image_label`, `e`.`small_image_label`, `e`.`thumbnail_label`, `e`.`frame_image`, `e`.`frame_image_label`, `e`.`bi_artstyle`, `e`.`bi_artstyle_value`, `e`.`bi_nationality`, `e`.`bi_nationality_value`, `e`.`bi_related_category`, `e`.`bi_products_count`, `e`.`bi_artists_multiverse`, `e`.`bi_artists_birth_date`, `e`.`bi_artists_death_date`, `e`.`bi_techniques`, `e`.`bi_chosen_product`, `e`.`bi_product_main_keyword`, `e`.`price`, `e`.`special_price`, `e`.`special_from_date`, `e`.`special_to_date`, `cat_index`.`position` AS `cat_index_position`, `e`.`display_price_group_0` AS `_rule_price` FROM `catalog_product_flat_1` AS `e`
  2. INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id='1' AND cat_index.visibility IN(3, 4) AND cat_index.category_id='3' ORDER BY `relevance` ASC, `e`.`created_at` ASC LIMIT 32



Tak na prawdę wyniki z Solra i tak są sortowane po pseudo-polu score, url mam taki:
http://localhost:8983/solr/en?indent=on&am...+asc,score+desc
i to działa, dane xmlowe ładnie prezentują się w kolejności takiej, jaka ma być.
Ok. Pytanie: w jaki sposób mogę nadpisać to domyślne zachowanie Magentowego sortowania po relevance tak, aby we froncie nadal była dostępna opcja relevance, ale sam współczynnik relevance byłby wyciągany na podstawie mojego Solrowego score'a (albo w ogóle nie był wyciągany gdyż dane domyślnie już są posortowane) zamiast danych z bazy? Chodzi tylko o sortowanie wyników wyszukiwania tylko w tym konkretnym przypadku czyli po trafności, reszta działa bez zarzutu. Z góry dzięki za odpowiedzi. Mam nadzieję, że nie namieszałem zbyt mocno, starałem się opisać problem najdokładniej, jak umiem. Uff nerdsmiley.png


rozwiązanie dla zainteresowanych:
Nadpisanie metod:
setOrder w kolekcji
setListOrders w bloku
setQueryFilter w modelu (mysql4/query/collection)
odpowiednia implementacja helpera widoku
oraz zastąpienie sortowania kolekcji własną implementacją korzystającą z danych od Solra
rozwiązują sprawę.