13

Trước hết, tôi đã tìm thấy các câu hỏi tương tự trong SO nhưng không có câu trả lời nào cho chúng. Vì vậy, phần đầu tiên của câu hỏi là một chút trùng lặp. Tôi muốn cải thiện kết quả tìm kiếm trong Magento. Dưới đây là những gì tôi đã thực hiện:Cách thức và nơi sửa đổi truy vấn tìm kiếm Magento?

1. Tìm kiếm với AND thay vì OR khi có nhiều từ.

2. Tìm kiếm Ajax bắt đầu tìm kiếm từ bất cứ đâu và không chỉ từ đầu các trường.

3. Cắt cuối cùng s từ các từ để ngăn kết quả trống khi tìm kiếm bằng số nhiều.

4. Tôi đã thay đổi kiểu tìm kiếm Like-Fulltext hoặc Combine nhưng kết quả không tốt hơn và thậm chí là tồi tệ nhất, vì vậy tôi rời khỏi nó như là. Bây giờ là Like, do đó không có yêu cầu relevance.

Điều cuối cùng mà tôi muốn thử là adding this to the search query:

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) 

Đây là câu hỏi của tôi, nhưng tôi không chắc chắn nếu nó sẽ làm việc vì tôi không thể kiểm tra nó:

$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)'); 

Ý tưởng chính là thêm trọng số tiền thưởng vào kết quả nếu truy vấn tìm kiếm được tìm thấy trong tiêu đề của sản phẩm. Vấn đề là tôi không biết phải sửa đổi truy vấn ở đâu. Tôi không thể tìm thấy nó ở đâu cả. $this->_productCollection không phải là đối tượng thích hợp, tôi biết điều đó. Tôi đã xem tất cả các tệp Collection.php, mô hình tài nguyên, mô hình và thậm chí cả nhật ký truy vấn nhưng không có may mắn. Chỉ có một hoặc hai phần hàng trong một số tệp nhưng không phải là truy vấn đầy đủ. Tôi mới đến Magento và vẫn gặp vấn đề với việc tìm kiếm loại nội dung này. Vì vậy, nơi tôi phải đặt công cụ bổ sung của mình khi tôi phải mở rộng truy vấn?

Magento phiên bản cộng đồng, phiên bản 1.6.1.0.

Lưu ý: Tôi biết rằng một số tiện ích mở rộng để cải thiện kết quả tìm kiếm sẽ hoạt động tốt hơn nhiều so với giải pháp của tôi nhưng hiện tại tôi phải thực hiện theo cách đó. Nó cũng sẽ là một trải nghiệm tốt cho tôi.

Edit:

Vì vậy, tôi đã tìm ra cách để thêm các trường tùy chỉnh của tôi cho đặt hàng nhưng nó
untruly tôi nghĩ. Trong prepareProductCollection phương pháp class Mage_CatalogSearch_Model_Layer extends Mage_Catalog_Model_Layer 's tôi bổ sung thêm hai tham gia vào truy vấn và nhận được các lĩnh vực rel1rel2:

$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.'")')) 
); 

tôi có các lĩnh vực này bây giờ nhưng như bạn có thể thấy tôi đã cứng mã hoá thứ như attribute_id = 96 vv mà không phải là tốt ở tất cả và nó sẽ không hoạt động mọi lúc - tôi đã kiểm tra các id này trực tiếp từ các bảng cơ sở dữ liệu. Tôi đã viết nó như thế này bởi vì tôi đã không truy cập vào các lĩnh vực nameshort_description nhưng họ đang ở trong kết quả. Không biết tại sao. Vì vậy, cpev.value là trường namecpet.value là trường short_description. Hơn nữa tôi không thể ra lệnh cho kết quả của các trường này.Tôi đã thử $collection->addOrder('SUM(rel1+rel2)');, $collection->getSelect()->order(new Zend_Db_Expr('SUM(rel1+rel2)').' DESC');, một số addAttributeToFilter nội dung vv nhưng không hoạt động.

Chỉnh sửa 2: tôi chấp nhận @ James 'câu trả lời nhưng cuối cùng chúng tôi đã mua một phần mở rộng để cải thiện kết quả tìm kiếm.

+0

Sử dụng Solr hoặc ElasticSearch Tôi tin rằng đó là cách tiếp cận tốt hơn cho vấn đề của bạn. Đó là một phù hợp hơn để bao gồm tìm kiếm số nhiều/số ít, từ đồng nghĩa, chính tả, liên quan. – FlorinelChis

+0

Xin cảm ơn, @FlorinelChis. Tôi đã kiểm tra các phần mở rộng Magento khác nhau. Nhưng bây giờ tôi muốn làm điều đó theo cách đó bởi vì tôi không có nhiều kinh nghiệm về việc bổ sung các công cụ của bên thứ 3 và điều thứ hai là tôi không có nhiều quyền trên cửa hàng web. Bạn có thể trợ giúp để sửa đổi truy vấn ban đầu không? – enenen

Trả lời

4

Trong Mage_CatalogSearch_Model_Resource_Fulltext séc ra prepareResult (dòng 310 trong 1,7 CE) và tìm kiếm những điều sau đây:

$select->columns(array('relevance' => new Zend_Db_Expr(0))); 

Magento tập hợp tất cả relevances kết quả tìm kiếm như 0; (!) thêm các mức độ phù hợp bạn muốn (cao hơn là tốt hơn) ở đây. Bạn có thể tạo truy vấn tùy chỉnh trong Zend_Db_Expr() để tạo mức độ phù hợp cao hơn trên các đối sánh thuộc tính.

3

Câu trả lời cho câu hỏi đầu tiên của bạn (1): Để thực hiện VÀ tìm kiếm thay vì OR, bạn sẽ cần phải viết lại lớp

Mage_CatalogSearch_Model_Resource_Fulltext 

Trong phương pháp này

public function prepareResult($object, $queryText, $query) 

bạn muốn để chuyển đổi phần

$likeCond = '(' . join(' OR ', $like) . ')'; 

đến

$likeCond = '(' . join(' AND ', $like) . ')'; 

Đảm bảo chỉ reindex chỉ mục tìm kiếm sau đó để có hiệu lực.

+0

_Đây là những gì tôi đã làm: _ là người đứng đầu danh sách –

+0

@mpaepper, tôi đã làm điều này. Vấn đề của tôi là sửa đổi truy vấn tìm kiếm. – enenen

+0

@enenen Xin lỗi, tôi đã hiểu sai trong câu hỏi của bạn. – mpaepper

Các vấn đề liên quan