Задать вопрос
@alabs

Как настроить релевантность поиска PHP + MySQL?

Добрый день.
Пример поиска - https://4ip.info/
Вводим "iphone 6", выдает все содержащее iphone 6 или iphone 6s , но не выдает, например, из строки, iPhone 7 1960 mAh, orig.
Так же и при запросе "6 iphone" .

Поиск по конструкции like '%iphone%' and like '6' найдет кучу всего лишнего. Полнотекстовый поиск вообще на цифру 6 забьет. Sphinx цифру тоже пережует, скорее всего.

Есть идея со словарем, но надеюсь, что можно как то проще организовать.

Буду рад предложениям, спасибо.
  • Вопрос задан
  • 312 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
@alabs Автор вопроса
Проблему решил в рамках php + mysql. Поиск не нагруженный на сайте. Вот решение:

Завел словарь моделей.
<?
	$slovar = array(
		'iphone 6' => 'iphone 6',
		'6 iphone' => 'iphone 6',
		'iphone 6s' => 'iphone 6s',
		'6s iphone' => 'iphone 6s',
		'iphone 7' => 'iphone 7',
		'7 iphone' => 'iphone 7',
		'iphone 7s' => 'iphone 7s',
		'7s iphone' => 'iphone 7s',
	);


Далее в поисковой строке заменяю все словосочетания, на словосочетания где вместо пробела нижнее подчеркивание. После разбивки поискового запроса на слова возвращаю пробелы на место.

$tmp = substr( $tmp, 0, 40 ); //обрезаем строку
//делаем массив с подчеркиваниями
		foreach($slovar as $k=>$v){
			$arr1[] = $k;
			$arr2[] = str_replace(" ", "_", $v);
		} 
//заменяем в поисковом запросе словосочетания
		$tmp =  str_replace($arr1, $arr2, $tmp);
//бьем поисковую строку  на пробелы
		$tmp = explode( ' ', $tmp );
//пробелы заменяем на конструкцию SQL
		$where = "`title` LIKE '%" . implode ( "%' AND `title` LIKE '%", $tmp ) . "%'";
//возвращаем в запрос обратно пробелы
		$where =  str_replace("_", " ", $where);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
Sphinx цифру тоже пережует, скорее всего.

Не попробуешь - не узнаешь.

А вообще для таких задач используется Elasticsearch
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы