Sự khác biệt giữa các loại tìm kiếm khác nhau là gì?
- Như
- Toàn văn
- Kết hợp
Tôi đặc biệt quan tâm đến cách thay đổi hành vi và hiệu suất tìm kiếm cho các cài đặt đó.
Sự khác biệt giữa các loại tìm kiếm khác nhau là gì?
Tôi đặc biệt quan tâm đến cách thay đổi hành vi và hiệu suất tìm kiếm cho các cài đặt đó.
Câu trả lời:
Mọi người luôn phàn nàn về tìm kiếm Magento nhưng tôi tin rằng nó có thể hoạt động thực sự tốt nếu bạn dành thời gian lập kế hoạch và cấu hình nó đúng cách.
Phương pháp tìm kiếm dựa trên từ khóa, phá vỡ truy vấn của bạn thành các từ riêng lẻ. Xem phần sau đây từ dòng 326 trong lớpMage_CatalogSearch_Model_Resource_Fulltext::prepareResult()
$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
foreach ($words as $word) {
$like[] = $helper->getCILike('s.data_index', $word, array('position' => 'any'));
}
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
Bạn có thể thấy nó phân tách từng từ trong truy vấn tìm kiếm của bạn và kết hợp chúng lại với nhau trong các câu lệnh THÍCH - bạn kết thúc bằng một cái gì đó như thế này:
WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'
Phương pháp này có thể hoạt động đối với các thiết lập cửa hàng nhất định trong đó tên sản phẩm đơn giản và khách hàng tìm kiếm các mặt hàng rất cụ thể, nhưng theo kinh nghiệm của tôi thì đó không phải là một lựa chọn tốt.
Mức độ phù hợp dựa trên tìm kiếm - mỗi truy vấn tìm kiếm được xếp loại accoring đến điểm chỉ định dựa trên MySQL của trận đấu ... CHỐNG truy vấn. Bạn có thể thấy điều này trong hành động trong Mage_CatalogSearch_Model_Resource_Helper_Mysql4
dòng 44:
public function chooseFulltext($table, $alias, $select)
{
$field = new Zend_Db_Expr('MATCH ('.$alias.'.data_index) AGAINST (:query IN BOOLEAN MODE)');
$select->columns(array('relevance' => $field));
return $field;
}
Bảng cơ sở dữ liệu Magento sử dụng khi thực hiện tìm kiếm toàn văn bản là catalogsearch_fulltext
. Một giá trị mẫu:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Các giá trị này được liên kết trực tiếp với các thuộc tính bạn chỉ định là 'Sử dụng trong Tìm kiếm nhanh' trong Danh mục> Thuộc tính> Quản lý thuộc tính
Khá tự giải thích. Hãy xem dòng 354 của Mage_CatalogSearch_Model_Resource_Fulltext :
if ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_COMBINE) {
$where .= ($where ? ' OR ' : '') . $likeCond;
} elseif ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_LIKE) {
$select->columns(array('relevance' => new Zend_Db_Expr(0)));
$where = $likeCond;
}
Bạn có thể thấy nó chỉ thêm kết quả THÍCH sau khi kết quả FULLTEXT quay lại.
Bạn có thể làm việc xung quanh điểm 5 & 6 bằng cách sử dụng phương pháp Kết hợp - kết quả THÍCH sẽ bù cho bất kỳ từ nào FULLTEXT bỏ qua.
Tìm kiếm "thích" sẽ thực hiện khớp như bình thường, sử dụng truy vấn '% keyword%' như. Một lợi thế của loại tìm kiếm này là nó sẽ khớp với các từ một phần. Nó có nhược điểm nghiêm trọng mặc dù:
Tìm kiếm toàn văn bản sẽ hoạt động bằng cách sử dụng tìm kiếm toàn văn bản MyISAM ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ). Bạn nên đọc về nó, nhưng tóm lại:
Hạn chế của fulltext là nó không thể thực hiện khớp một phần, tức là tìm kiếm "phở" sẽ không tìm thấy "điện thoại"
Tìm kiếm "kết hợp" sẽ sử dụng điều kiện "thích" để khớp với kết quả nhưng cũng sẽ xem xét điểm tìm kiếm toàn văn bản để sắp xếp chúng. Điều này có nghĩa là bạn sẽ nhận được nhiều kết quả hơn (như tìm kiếm cũng sẽ khớp một phần) và chúng cũng sẽ được sắp xếp tốt hơn vì điểm toàn văn bản.
Như những người khác đã nói, nếu bạn nghiêm túc về tìm kiếm, bạn nên sử dụng Solr. Đó là cách nhanh hơn và phù hợp hơn rất nhiều. Bạn sẽ phải sở hữu Magento EE và tự cài đặt Solr.
Chúng là các tham chiếu trực tiếp đến loại truy vấn mà Magento sẽ sử dụng. Cá nhân tôi nghĩ rằng tìm kiếm Toàn văn bản mạnh mẽ hơn và hiệu suất tốt hơn, đặc biệt nếu THÍCH được sử dụng với các ký tự đại diện (%). Một sự kết hợp của cả hai có lẽ sẽ chính xác nhất nhưng có thể là quá mức cần thiết. Tôi sẽ gắn bó với Toàn văn.
Nhưng nếu bạn đang tìm kiếm một giải pháp tìm kiếm mạnh mẽ, hãy xem dự án này: https://code.google.com.vn/p/magento-solr/ . SOLR được xây dựng để tìm kiếm các bộ sưu tập lớn và trong khi có thể mất một chút thời gian để thực hiện thì nó cũng đáng giá. Cá nhân tôi chưa bao giờ sử dụng nó trong Magento trước đây nhưng trong các dự án PHP khác, nó hoạt động rất tốt.
Tài liệu toàn văn có thể được tìm thấy ở đây: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html tài liệu THÍCH tại đây: http://dev.mysql.com/doc/refman/5.0 /en/opes-comparison-fifts.html
OR
thành AND
?
Vấn đề với THÍCH là nó sử dụng "% hạn%" theo mặc định. Tôi đã thay đổi nó để phù hợp với "hạn%" (lưu ý khoảng trắng trước thuật ngữ), sao cho phù hợp với sự bắt đầu của các từ. Tôi cũng đã cắt các 's' cuối cùng trong cụm từ tìm kiếm để "ô tô" cho kết quả giống như "ô tô". Rõ ràng điều đó không giúp ích gì với những danh từ bất quy tắc như "trẻ em", nhưng dù sao đó cũng là một cải tiến lớn.
Động thái vô nghĩa lớn nhất không thể giải thích được của Magento là sử dụng tìm kiếm "HOẶC" thay vì "VÀ". Nếu bạn tìm kiếm "ô tô màu đỏ", bạn sẽ nhận được mọi thứ màu đỏ (bao gồm ô tô, chó, dĩa, sườn núi, v.v.) và mọi loại ô tô (bao gồm đỏ, xanh dương, xanh lá cây, vàng, v.v.). Với "VÀ", bạn chỉ nhận được các mục có chứa "màu đỏ" VÀ "xe hơi", đó là cách tìm kiếm nên hoạt động!
Trích dẫn từ jharrison. Trả lời, thay đổi điều này:
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
Về điều này:
if ($like) {
$likeCond = '(' . join(' AND ', $like) . ')';
}
Để có được một sự thúc đẩy ngay lập tức, lớn đến mức độ phù hợp của kết quả tìm kiếm của bạn.
Đối với điều số nhiều, bạn có thể cắt bỏ "s" cuối cùng của một từ như thế này:
$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
$words = array_walk($words,function(&$value, &$key) {
// use substr(...) instead of rtrim($value,'s')
// because rtrim will remove multiple esses
$value = (substr($value,-1,1) === 's') ? substr($value,0,strlen($value - 1)) : $value;
});
foreach ($words as $word) {
$like[] = $helper->getCILike('s.data_index', $word, array('position' => 'start')); // note I changed this to 'start'
}
Trong app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
bạn có thể ghi đè tệp lõi và thay đổi public function escapeLikeValue($value, $options = array())
dưới dạng phím tắt nhanh, mặc dù cách được khuyên là làm điều tương tự trong mô-đun. Nhưng đây rồi.
Dưới if (isset($options['position'])) {
đó là một công tắc. Tôi đã thay đổi các trường hợp cho 'bắt đầu' và 'kết thúc' để thêm khoảng trắng trước và sau giá trị:
case 'start':
$value = '% ' . $value . '%'; // added '% ' . before
// $value = $value . '%'; // core way (bad way)
break;
case 'end':
$value = '%' . $value . ' %'; // added . ' %' after
// $value = '%' . $value; // core way (bad way)
break;
Đối với các khoảng trắng trước / sau khi hoạt động, có lẽ bạn cũng phải thay đổi cách xây dựng chỉ mục tìm kiếm, như tôi đã làm, để đảm bảo có khoảng trắng trước và sau mỗi từ. Cách mặc định để xây dựng chỉ mục là tách từng trường bằng một '|' (ký tự ống), ví dụ "màu xanh | xe | xe rất đẹp" để lập chỉ mục màu, loại sản phẩm, mô tả sản phẩm. Nhưng chỉ số của tôi có "màu xanh | xe | một chiếc xe rất đẹp". Bạn thậm chí có thể sửa đổi việc xây dựng chỉ mục tìm kiếm để có thể thay thế các từ có gạch nối ("siêu xe siêu nhanh" trở thành "siêu xe nhanh"), v.v., v.v.
Mượn một đề thi từ câu trả lời của jharrison., Trong đó một trường chỉ mục tìm kiếm mặc định sẽ trông như thế này:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Của tôi sẽ trông như thế này:
EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable |
(lưu ý khoảng trắng trước và sau mỗi "|" và "/" và khoảng trắng trước từ đầu tiên)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
. Tập tin này không được sử dụng ở đâu ngoài chức năng tìm kiếm?
LIKE
trong các truy vấn tìm kiếm SQL và Magento tìm kiếm ở đâu ngoài chỉ mục tìm kiếm sản phẩm? Tôi đã thực hiện thay đổi này hơn 2 năm trước trong một trang web sản xuất và chúng tôi không tìm thấy bất kỳ lỗi nào liên quan đến vấn đề này cả. Tất cả những gì nó thực sự làm là làm cho nó để "bắt đầu từ" phải có khoảng trắng trước nó và "cuối từ" phải có khoảng trắng sau. Một cách riêng biệt, trong chỉ mục, tôi đảm bảo mỗi từ có khoảng trắng xung quanh nó.
Không có cách nào ở trên, sử dụng công cụ tìm kiếm Zend Lucene tích hợp bằng cách cài đặt một cái gì đó như Blast Lucene Search hoặc Extendware Lucene Search. Sự liên quan đánh bại bất kỳ dịch vụ MySQL nào.
Vâng, tôi đã trải qua tất cả các lần lặp lại cho câu trả lời được chấp nhận, nhưng thẳng thắn mà nói, việc tìm kiếm Stock Magento được tối ưu hóa vẫn còn rất thiếu.
Mặt khác, Lucene cung cấp và đã được bao gồm trong bản cài đặt Magento, nó chỉ cần một Mô-đun để kích hoạt nó.