Loại tìm kiếm: Thích, Toàn văn hay Kết hợp?


48

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 đó.

Câu trả lời:


63

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.


Như

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.


Toàn văn

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_Mysql4dò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


Phối hợp

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.


Những điều cần lưu ý

  1. Tôi thực sự khuyên bạn nên sử dụng FULLTEXT để có hiệu suất tốt hơn và kết quả có liên quan
  2. Đi qua từng thuộc tính và xem xét có cần thiết phải thêm nó vào chỉ mục fulltext không ('Sử dụng trong tìm kiếm nhanh')
  3. Theo mặc định, các mô tả sản phẩm được bao gồm trong lập chỉ mục FULLTEXT. Tôi hầu như luôn loại bỏ các mô tả khi chúng làm ô nhiễm điểm số liên quan bằng các từ được sử dụng trong bối cảnh không liên quan.
  4. Đảm bảo các thuộc tính meta của bạn được sử dụng trong chỉ mục fulltext. Dân trí với nội dung có ý nghĩa.
  5. MySQL FULLTEXT có một số điểm kỳ quặc - nó có một danh sách các từ bị bỏ qua có thể gây rắc rối nếu tên sản phẩm của bạn được tạo thành từ những từ này!
  6. Theo mặc định, MySQL bỏ qua các truy vấn FULLTEXT dưới 4 ký tự . Các thuộc tính có giá trị ngắn sẽ bị bỏ qua trừ khi bạn thay đổi giá trị này.

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.


7

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ù:

  • sẽ nhanh chóng trở thành một vấn đề hiệu suất
  • sự liên quan là xấu. Thực tế không có khái niệm "mức độ liên quan" trong các truy vấn như

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:

  • hiệu suất tốt hơn
  • nó sẽ loại trừ các từ khóa (như "và", "với" vv)
  • Nó sẽ chỉ định điểm theo mặc định cho từng kết quả dựa trên mức độ phù hợp

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.


1
Cảm ơn câu trả lời này. Tại sao tôi cần Magento EE?
PiTheNumber

1
Tìm kiếm Solr là một phần của Magento Enterprise (không phải là một tính năng của cộng đồng). Có các tiện ích mở rộng sẽ triển khai tìm kiếm trong cộng đồng như magentoc Commerce.com/magento-connect/solr-bridge-search.html . Tôi đã không sử dụng chúng mặc dù.
Paul Grigoruta

6

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


Fulltext mạnh hơn, nhưng cần thiết lập trong my.cnf nếu nó sẽ cho kết quả cho các từ dưới 5 hoặc 4 ký tự, tùy thuộc vào thiết lập mặc định của nó. Giống như tìm kiếm thường bị hỏng và cần phải thay đổi logic từ OR thành AND để nó không tạo ra quá nhiều kết quả không liên quan.
Phòng thí nghiệm Fiasco

Bạn nói đúng về fulltext. Luôn luôn thông minh để lưu trữ trên VPS hoặc với một công ty cung cấp dịch vụ lưu trữ Magento. Các tùy chọn như cấu hình Fulltext sẽ có sẵn sau đó hoặc ít nhất bạn có thể tự đặt chúng. Bạn có đề xuất tìm kiếm bên thứ 3 nào @Fiasco Labs không?
Sander Mangel

@FiascoLabs, làm thế nào để bạn thay đổi ORthành AND?
Michael Yaeger

3

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.phpbạ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)


1
Bạn đã đề cập đến ghi đè 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?
amitshree

1
@amitshree Câu hỏi hay. Tôi không biết trên đỉnh đầu của tôi. Nó có thể được sử dụng bởi bất kỳ tài nguyên mô hình nào cho kết quả tìm kiếm, tôi cho rằng. Nhưng điều này thực sự đặc biệt để thoát LIKEtrong 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ó.
Butussy Butkus

2

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ó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.