Jak i gdzie zmodyfikować zapytanie wyszukiwania Magento?
Po pierwsze, znalazłem podobne pytania w SO, ale nie ma na nie odpowiedzi. Tak więc pierwsza część pytania jest nieco zduplikowana. Chcę poprawić wyniki wyszukiwania w Magento. Oto co już zrobiłem:
1 Wyszukaj za pomocąAND
zamiastOR
kiedy jest wiele słów.
2. Wyszukiwanie Ajax rozpoczyna wyszukiwanie w dowolnym miejscu i nie tylko od początku pól.
3. Przytnij ostatnis
od słów, aby zapobiec pustym wynikom podczas wyszukiwania za pomocą liczby mnogiej.
4. Zmieniłem typ wyszukiwania zLike
doFulltext
lubCombine
ale wyniki nie były lepsze, a nawet były najgorsze, więc pozostawiam to tak, jak jest. JegoLike
teraz nie marelevance
zamawianie.
Ostatnią rzeczą, którą chcę wypróbować, jestdodając to do zapytania wyszukiwania:
SELECT ... other non-full-text-cols
MATCH (product_title) AGAINST ('lean body for her') AS rel1,
MATCH (content) AGAINST ('lean body for her') AS rel2
FROM table
WHERE MATCH (product_title,content) AGAINST ('lean body for her')
ORDER BY (rel1*1.5)+(rel2)
Oto moje zapytanie, ale nie jestem pewien, czy zadziałałoby, ponieważ nie mogę go przetestować:
$this->_productCollection->addAttributeToSelect(
array(
'rel1' => new Zend_Db_Expr('MATCH (name) AGAINST ("'.$queryText.'")'),
'rel2' => new Zend_Db_Expr('MATCH (short_description) AGAINST ("'.$queryText.'")')
)
);
$this->_productCollection->getSelect()
->where('MATCH (name,short_description) AGAINST ("'.$queryText.'")')
->order('(rel1*1.5)+(rel2)');
Główną ideą jest dodanie dodatkowej wagi do wyniku, jeśli wyszukiwane hasło znajduje się w tytule produktu. Problem polega na tym, że nie wiem, gdzie zmodyfikować zapytanie. W ogóle nie mogę znaleźć, gdzie to jest.$this->_productCollection
nie jest właściwym obiektem, wiem to. Spojrzałem na wszystkoCollection.php
pliki, modele zasobów, modele, a nawet dziennik zapytań, ale nie ma szczęścia. W niektórych plikach jest tylko 1 lub 2 części wiersza, ale nie jest to pełne zapytanie. Jestem nowy w Magento i wciąż mam problemy ze znalezieniem tego typu rzeczy. Więc gdzie muszę umieścić dodatkowe rzeczy, gdy muszę rozszerzyć zapytanie?
Community Edition Magento, wersja 1.6.1.0.
Uwaga: Wiem, że niektóre rozszerzenia do ulepszenia wyników wyszukiwania będą działać lepiej niż moje rozwiązania, ale na razie muszę to zrobić w ten sposób. Dla mnie też byłoby to dobre doświadczenie.
Edytować:
Więc wymyśliłem, jak dodać moje niestandardowe pola do zamówienia, ale to
nieprawdopodobnie myślę. Wclass Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_Layer
jestprepareProductCollection
metoda Dodałem dwa sprzężenia do zapytania i otrzymałem polarel1
irel2
:
$collection->getSelect()->joinLeft(
array('cpev' => 'catalog_product_entity_varchar'),
'cpev.entity_id = e.entity_id AND cpev.attribute_id = 96',
array('rel1' => new Zend_Db_Expr('2.01*(LENGTH(cpev.value) - LENGTH(REPLACE(LCASE(cpev.value), LCASE("'.$queryText.'"), ""))) / LENGTH("'.$queryText.'")'))
);
$collection->getSelect()->joinLeft(
array('cpet' => 'catalog_product_entity_text'),
'cpet.entity_id = e.entity_id AND cpet.attribute_id = 506',
array('rel2' => new Zend_Db_Expr('(LENGTH(cpet.value) - LENGTH(REPLACE(LCASE(cpet.value), LCASE("'.$queryText.'"), ""))) / LENGTH("'.$queryText.'")'))
);
Mam teraz te pola, ale jak widać, mam takie zakodowane rzeczyattribute_id = 96
itd., co wcale nie jest dobre i nie będzie działać za każdym razem - sprawdziłem te identyfikatory bezpośrednio z tabel bazy danych. Napisałem to tak, ponieważ nie mam dostępuname
ishort_description
pola, ale są w rezultacie. Nie wiem dlaczego. Więc,cpev.value
jestname
pole icpet.value
jestshort_description
pole. Ponadto nie mogę zamówić wyników według tych pól. próbowałem$collection->addOrder('SUM(rel1+rel2)');
, $collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');
, trochęaddAttributeToFilter
rzeczy itp., ale to nie działa.
Edytuj 2: zaakceptowałem@James„odpowiedź, ale w końcu kupiliśmy rozszerzenie do ulepszania wyników wyszukiwania.