검색 유형 : 좋아요, 전체 텍스트 또는 결합?


48

다른 검색 유형의 차이점은 무엇입니까?

  • 처럼
  • 전문
  • 결합

검색 설정 및 해당 설정의 성능이 어떻게 변경되는지에 특히 관심이 있습니다.

답변:


63

모두가 항상 Magento 검색에 대해 불만을 제기하지만 계획 및 구성에 시간을 투자하면 제대로 작동 할 수 있다고 생각합니다.


처럼

키워드 기반 검색 방법으로 검색어를 개별 단어로 나눕니다. 클래스 326 행에서 다음을 참조하십시오.Mage_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) . ')';
            }

검색어에서 각 단어를 분리하여 LIKE 문으로 결합하는 것을 볼 수 있습니다.

WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'

이 방법은 제품 이름이 단순하고 고객이 매우 특정한 품목을 검색하는 특정 상점 설정에 효과적 일 수 있지만 제 경험상이 방법은 적합하지 않습니다.


전문

관련성 기반 검색-모든 검색 쿼리는 MySQL의 MATCH ... AGAINST 쿼리를 기반으로 지정된 점수에 따라 등급이 매겨집니다 . Mage_CatalogSearch_Model_Resource_Helper_Mysql444 행 에서이를 확인할 수 있습니다 .

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;
}

전체 텍스트 검색을 수행 할 때 Magento가 사용하는 데이터베이스 테이블은 catalogsearch_fulltext입니다. 예제 값 :

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

이러한 값은 카탈로그> 속성> 속성 관리에서 '빠른 검색에 사용'으로 지정한 속성에 직접 연결됩니다.


결합시키다

꽤 자명하다. Mage_CatalogSearch_Model_Resource_Fulltext의 354 행을 살펴보십시오 .

        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;
        }

FULLTEXT 결과가 돌아온 후 LIKE 결과를 추가하는 것을 볼 수 있습니다.


참고 사항

  1. 더 나은 성능과 관련 결과를 위해 FULLTEXT를 사용하는 것이 좋습니다.
  2. 각 속성을 살펴보고 전체 텍스트 색인에 추가해야하는지 여부를 고려하십시오 ( '빠른 검색에 사용')
  3. 기본적으로 제품 설명은 FULLTEXT 색인에 포함됩니다. 나는 항상 관련성없는 맥락에서 사용되는 단어로 관련성 점수를 오염시키기 때문에 설명을 거의 제거합니다.
  4. 메타 속성이 전체 텍스트 색인에 사용되는지 확인하십시오. 의미있는 내용으로 채 웁니다.
  5. MySQL FULLTEXT에는 몇 가지 단점 이 있습니다. 제품 이름이 이러한 단어로 구성되어 있으면 문제가 될 수있는 무시할 수있는 단어 목록 이 있습니다!
  6. MySQL은 기본적 으로 4 자 미만의 FULLTEXT 쿼리를 무시합니다 . 이 값을 변경하지 않으면 짧은 값을 가진 속성이 무시됩니다.

Combine 방법을 사용하여 포인트 5 및 6을 해결할 수 있습니다. LIKE 결과는 FULLTEXT가 무시한 단어를 보완해야합니다.


7

"like"검색은 유사한 '% keyword %'쿼리를 사용하여 일반적인 유사 검색을 수행합니다. 이 유형의 검색의 장점 중 하나는 부분 단어와 일치한다는 것입니다. 그래도 심각한 단점이 있습니다.

  • 빨리 성능 문제가 될 것입니다
  • 관련성이 나쁘다. 실제로 같은 쿼리에는 "관련성"이라는 개념이 없습니다.

전체 텍스트 검색은 MyISAM 전체 텍스트 검색 ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html )을 사용하여 작동합니다 . 그것에 대해 읽어야하지만 간단히 말해서 :

  • 성능이 더 좋다
  • 스톱 워드는 제외합니다 (예 : "and", "with"등)
  • 관련성에 따라 기본적으로 각 결과에 점수를 할당합니다

전체 텍스트의 단점은 부분적으로 일치 할 수 없다는 것입니다. 즉 "pho"를 검색하면 "phone"을 찾을 수 없습니다

"결합 된"검색은 "like"조건을 사용하여 결과와 일치하지만 결과를 정렬하기위한 전체 텍스트 검색 점수도 고려합니다. 즉, 검색에서 부분 일치를 수행하는 것처럼 더 많은 결과를 얻을 수 있으며 전체 텍스트 점수로 인해 더 나은 순서로 정렬됩니다.

다른 사람들이 말했듯이 검색에 대해 진지한 경우 Solr을 사용해야합니다. 훨씬 빠르고 관련성이 높습니다. Magento EE를 소유하고 Solr을 직접 설치해야합니다.


1
이 답변에 감사드립니다. Magento EE가 필요한 이유는 무엇입니까?
PiTheNumber

1
Solr 검색은 커뮤니티의 기능이 아닌 Magento Enterprise의 일부입니다. magentocommerce.com/magento-connect/solr-bridge-search.html 과 같이 커뮤니티에서 검색을 구현할 확장이 있습니다 . 나는 그들을 사용하지 않았다.
Paul Grigoruta

6

Magento가 사용할 쿼리 유형에 대한 직접적인 참조입니다. 개인적으로 필자는 특히 LIKE가 와일드 카드 (%)와 함께 사용되는 경우 전체 텍스트 검색이 더 강력하고 성능이 더 좋다고 생각합니다. 이 둘의 조합이 가장 정확할 수도 있지만 과잉 일 수 있습니다. 나는 전체 텍스트를 고수 할 것입니다.

그러나 강력한 검색 솔루션을 찾고 있다면 https://code.google.com/p/magento-solr/ 프로젝트를 확인 하십시오 . SOLR은 대규모 컬렉션을 검색하기 위해 구축되었으며 구현하는 데 시간이 걸릴 수 있지만 그만한 가치가 있습니다. 개인적으로 나는 이전에 Magento에서 사용한 적이 없지만 다른 PHP 프로젝트에서는 잘 수행했습니다.

전체 텍스트 문서는 여기에서 찾을 수 있습니다 : http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html 문서 LIKE 여기 : http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html


전체 텍스트는 더 강력하지만 기본 설정에 따라 5 자 또는 4 자 미만의 단어에 대한 결과를 제공하려면 my.cnf에서 설정이 필요합니다. 검색은 종종 깨진 상태로 제공되며 논리를 OR에서 AND로 변경해야하므로 관련성이없는 결과가 너무 많이 나오지 않습니다.
Fiasco Labs

당신은 전문에 대한 권리입니다. VPS에서 호스팅하거나 Magento 호스팅을 제공하는 회사에서 항상 스마트합니다. 전체 텍스트 구성과 같은 옵션을 사용할 수 있어야합니다. 그렇지 않으면 직접 설정할 수 있습니다. @Fiasco Labs에 대한 타사 검색 제안이 있습니까?
Sander Mangel

@FiascoLabs, 당신은 어떻게 변경합니까 ORAND?
Michael Yaeger

3

LIKE의 문제점은 기본적으로 "% term %"을 사용한다는 것입니다. 단어의 시작 부분과 일치하도록 "term %"(용어 앞의 공백에 유의)와 일치하도록 변경했습니다. 또한 "cars"가 "car"와 동일한 결과를 제공하도록 검색어에서 마지막 's'를 잘라 냈습니다. 분명히 "어린이"와 같은 불규칙 명사에는 도움이되지 않지만 어쨌든 크게 개선되었습니다.

Magento가 말도 안되는 가장 큰 의미없는 움직임은 "AND"대신 "OR"검색을 사용하는 것입니다. "빨간 차"를 검색하면 모든 차 (개, 개, 포크, 산 등)와 모든 종류의 차 (빨강, 파랑, 녹색, 노랑 등)를 얻을 수 있습니다. "AND"를 사용하면 "빨간색"과 "차"가 포함 된 항목 만 검색 할 수 있습니다.

jharrison.au의 답변에서 인용하면 다음과 같이 변경하십시오.

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

이에:

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

검색 결과의 관련성을 즉각적으로 대폭 향상시킵니다.

복수의 경우 다음과 같이 단어의 마지막 "s"를 잘라낼 수 있습니다.

$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'
}

에서 app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php당신이 코어 파일을 덮어 쓸 수 있습니다 및 변경 public function escapeLikeValue($value, $options = array())조언 방법은 모듈에서 같은 일을하지만, 빠른 바로 가기로. 그러나 여기 있습니다.

아래 if (isset($options['position'])) {에 스위치가 있습니다. 값 전후에 공백을 추가하기 위해 'start'및 'end'의 경우를 변경했습니다.

 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;

작업 전후의 공백의 경우 검색 단어가 작성되는 방식을 변경해야하므로 모든 단어 전후에 공백이 있어야합니다. 색인을 작성하는 기본 방법은 각 필드를 '|'로 구분하는 것입니다. (색깔 문자), 예를 들어 색상 색인, 제품 유형, 제품 설명을위한 "아주 좋은 차". 그러나 내 색인에는 "blue | car | a nice nice car"가 있습니다. 검색 색인 작성을 수정하여 하이픈으로 묶인 단어를 대체 할 수도 있습니다 ( "초고속 자동차"가 "초고속 자동차"가 됨) 등

jharrison.au의 답변에서 예제를 빌리면 기본 검색 색인 필드는 다음과 같습니다.

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

광산은 다음과 같습니다.

 EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable | 

( "|"및 "/"앞뒤 공백과 첫 단어 앞 공백)


1
오버라이드에 대해 언급했습니다 app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php. 이 파일은 검색 기능 이외의 다른 곳에서는 사용되지 않습니까?
amitshree

1
@amitshree 좋은 질문입니다. 나는 내 머리 꼭대기를 모른다. 검색 결과를 위해 모든 모델 리소스에서 사용할 수 있다고 생각합니다. 그러나 이것은 실제로 LIKESQL 검색 쿼리에서 탈출하기위한 것이며 Magento는 어디에서 제품 검색 색인에서 검색합니까? 2 년 전에 프로덕션 사이트에서이 변경을 수행했지만 이와 관련된 버그를 전혀 찾지 못했습니다. "단어 시작"앞에 공백이 있어야하고 "단어 끝"뒤에 공백이 있어야합니다. 별도로, 색인에서 모든 단어 주위에 공백이 있는지 확인합니다.
Buttle Butkus

2

위의 어느 것도 Blast Lucene Search 또는 Extendeware Lucene Search와 같은 것을 설치하여 내장 Zend Lucene 검색 엔진을 사용하십시오. 관련성은 MySQL 제품보다 뛰어납니다.

응, 나는 대답에 대한 모든 반복을 겪었지만 솔직히 말하면 Optimized Stock Magento 검색에는 여전히 부족했습니다.

반면 Lucene은 Magento 설치에 이미 포함되어 있으며이를 활성화하려면 모듈 만 있으면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.