Я создаю сайт сравнения цен в php и mysql. поэтому мне нужно найти похожие продукты и сопоставить их, чтобы создать таблицу сравнения цен. В моей базе данных доступно более 10 000 продуктов, поэтому для поиска похожих продуктов я создал полнотекстовый индекс mysql в столбцах названия и описания продукта и сравнил продукт с другими продуктами, но не могу получить желаемый результат, например, если я ищу
Поиск «Samsung Galaxy A7 (2017) 32gb», получить результаты:
Примечание: в наборе результатов только первые два и четвертый продукт похожи, остальные не
Теперь у меня есть вопрос:
Как найти важное ключевое слово в поисковом запросе, чтобы ключевое слово требовалось хотя бы в другом продукте, чтобы знать сходство? Например, в приведенном выше поисковом запросе «Samsung Galaxy A7» является важным ключевым словом, которое в результате должно быть указано в другом продукте. Мы, Человек, можем знать, что «Samsung Galaxy A7» является важным ключевым словом из «Samsung Galaxy A7 (2017) 32gb» для сравнения с другими продуктами, но как узнать компьютерную программу?
Существует любой алгоритм для сравнения подобного продукта по важному ключевому слову, как алгоритм просеивания при сравнении изображений.
Если у вас есть какой-либо хороший способ найти похожие продукты, пожалуйста, предложите мне
Посмотрите вокруг Elasticsearch которая является поисковой системой.
Это может сделать поиск по ключевым словам и вернуть результат по оценке.
Вы можете увеличить или уменьшить счет в некоторых отношениях,
но он не достаточно умен, чтобы определить ключевые слова, такие как человек.
Тем не менее, он может определять общие термины в ваших документах (например, «the», «a» … или «32gb», если есть много моделей, использующих этот термин.) И корректировать оценку этих общих терминов, чтобы снизить оценку. (Запрос общих терминов ES)
Elasticsearch является мощным (так как его сложность), он может иметь много лучших решений для этой темы.
Редактировать: хороший статья о «запросе общих терминов» и «списке стоп-слов». Стоп-слова могут навсегда исключить спецификации, если вы этого хотите. Иногда «запрос общих терминов» не работает, если данные записи недостаточно широки. (например: Samsung Galaxy чаще, чем 32 ГБ)
Звучит как простой ЛАЙК:
SELECT name FROM products WHERE name LIKE 'Samsung Galaxy A7%';
Это позволит выбрать все продукты, которые начинаются с «Samsung Galaxy A7».
Если вы хотите выбрать также тех, кто не начинает с этого имени, а просто содержит его, измените его на
WHERE name LIKE '%Samsung Galaxy A7%'
Я думаю, что я бы разделить их на пробелы, удалить пробелы и обернуть все слова вокруг LIKE %str% AND
— что-то вроде этого:
$search='Samsung Galaxy A7 (2017) 32gb';
$split=preg_split('/\s+/u',$search);
$query='SELECT * FROM tbl WHERE ';
foreach($split as $str){
$query.='`name` LIKE \'%'.$db->real_escape_string($str).'%\' AND ';
}
$query=substr($query,0,-strlen(' AND '));
var_dump($query);
SELECT * FROM tbl WHERE `name` LIKE '%Samsung%' AND `name` LIKE '%Galaxy%' AND `name` LIKE '%A7%' AND `name` LIKE '%(2017)%' AND `name` LIKE '%32gb%'
(тестовый код: https://3v4l.org/30llU )но держу пари, что где-то есть php-библиотека, где эти проблемы уже решены … возможно