2017-11-26 1 views
1

나는 접근 방법을 모르는 문제가 있습니다.SQL에서 "관심이있을 수있는 제품"알고리즘을 만드시겠습니까?

나는 사용자가 제품, 사용자 및 제품을 저장하는 간단한 데이터베이스를 가지고 있습니다. 각 제품에는 이름, 카테고리 및 가격이 있습니다.

내 목표는 다음과 같습니다. 사용자에게 "관심이있을 것"이라고 제안 된 5 가지 항목의 목록을 표시하고 싶습니다. 주요 문제는 LIKE % 검색하고 싶지 않다는 것입니다. .. %에 대한 이름이지만, 사용자가 일반적으로 구매하는 제품의 유형, 보통 구매하는 가격 범위 및 더 자주 구입되는 제품에 우선 순위를 부여하려는 경우도 고려해야합니다.

그런 알고리즘이 사실입니까? 모든 카테고리를 의미 론적으로 "유사한"버킷으로 그룹화하고 그로부터 거리를 계산하는 것과 같은 여러 통계를 생각할 수 있지만 여러 기준이있을 때 어떻게 순위를 매겨 야할지 잘 모르겠습니다.

어쩌면 나는 각 기준에 중요도 요소를 부여하고 결과에 거리 * 곱셈을 곱해야합니까?

+0

는 특정 DBMS에 노력하고 있습니까? – Blag

+0

실제로 Spring 데이터 + JPA 프로젝트를위한 것이지만 엉망이므로 MySql/MariaDB라고 가정합시다. – dac1n

+0

이것은 고전적인 데이터 과학 유형 문제입니다. – Paparazzi

답변

1

수행 할 수있는 작업은 데이터베이스의 각 제품에 대해 2 개의 추가 필드를 만드는 것입니다. 예를 들어 Type이라는 첫 번째 필드에서는 "RC"라고 말할 수 있고 두 번째 필드에서는 비슷한 "RC, Radio, Electronics, Remote, Model"라고 말할 수 있습니다. 그런 다음 SQL의 쿼리에서 나중에 선택할 수 있습니다. 유형 및 유사 제품간에 일치하는 제품. 이것은 속임수가 될 수 있으므로 제품 이름에만 의존하지 않는 시스템을 제공합니다. 그것은 여전히 ​​LIKE 명령을 사용하지만, 다른 제품이이 제품과 유사한 제품에 대해 미리 정의되어 있으므로 훨씬 정확합니다.

데이터베이스의 크기에 따라 이미 가장 간단한 옵션이라고 생각합니다.

1
좀 가중치 검색에 MySQL을이 사용하던

:

SELECT *, 
    IF(
     `libelle` LIKE :startSearch, 30, 
     IF(`libelle` LIKE :fullSearch, 20, 0) 
    ) 
    + IF(
     `description` LIKE :startSearch, 10, 
     IF(`description` LIKE :fullSearch, 5, 0) 
    ) 
    + IF(
     `keyword` LIKE :fullSearch, 1, 0 
    ) 
    AS `weight` 
FROM `t` 
WHERE (
    -- at least 1 match 
    `libelle` LIKE :fullSearch 
    OR `description` LIKE :fullSearch 
    OR `keyword` LIKE :fullSearch 
) 
ORDER BY 
     `weight` DESC 

/* 
'fullSearch'=>'%'.str_replace(' ', '_', trim($search)).'%', 
'startSearch'=>str_replace(' ', '_', trim($search)).'%', 
*/ 
관련 문제