@groovie

Как сделать поиск по точному вхождению поискового слова?

Есть такой фильтр для cms DLE, код ниже в спойлере. Если ввести в поиске слово "Работа", он находит все новости, в которых это слово встречается. Например: "работа", "работа на дому", "работа по найму" - из всех этих он должен найти только то, у которого лишь точное слово поиска "работа" без всяких "работа на дому" и так далее. Либо если вписали в поиск "работа на дому" должен искать только это.
spoiler
<?php

if( !defined( 'DATALIFEENGINE' )) return;

if(!$form_field_arr)
{
	$form_field = $db->safesql(trim( $_REQUEST['form_field'] ));
	if(substr($form_field, -1) == "/")
		$form_field = substr($form_field, 0, -1);
	$form_field = explode("/page/", $form_field);
	$form_field = explode("/", $form_field[0]);
	$form_field_arr = array();
	foreach($form_field as $val)
	{
		$val_arr = explode("=", $val);
		if($val_arr[1] != "")
		{
			if(array_key_exists($val_arr[0], $form_field_arr))
				$form_field_arr[$val_arr[0]] .= "," . $val_arr[1];
			else
				$form_field_arr[$val_arr[0]] = $val_arr[1];
		}
	}
}
$delete_array_keys = array
(
	"date" 		=> "1970-01-01",
	"do"		=> "",
	"cstart"	=> "0",
	"cat"		=> "",
	"sort"		=> "",
	"order"		=> "",
	"order_by" 	=> "",
	"tsn"		=> "",
);

$xf_filter_arr = array();
$where = array();

$xfield_data = array_diff_key($form_field_arr, $delete_array_keys);

foreach($xfield_data as $key => &$value)
{
	if(count(explode(",", $value)) > 1)
		$value = explode(",", $value);
	if($value != NULL && $value != "" && is_array($value))
	{
		if(substr_count( $key, 'l.'))
		{
			$key = str_replace("l.", "", $key);
			foreach($value as $index => &$val)
			{
				$val = $db->safesql($val);
				$key = $db->safesql($key);
				$like_filter_arr[$key][] = "{$key} LIKE '%{$val}%'";
			}
			$where_like_arr[] =  "(" . implode(' OR ', $like_filter_arr[$key]) . ")";
		}
		elseif(substr_count( $key, 'm.'))
		{
			$key = str_replace("m.", "", $key);
			$val = $db->safesql(implode("|", $value));
			$key = $db->safesql($key);
			$match_filter_arr[$key][] = "{$key} REGEXP '[[:<:]](". $val .")[[:>:]]'";
			$where_match_arr[] =  "(" . implode(' OR ', $match_filter_arr[$key]) . ")";
		}
		elseif(substr_count( $key, 's.'))
		{
			$key = str_replace("s.", "", $key);
			foreach($value as $index => &$val)
			{
				$val = $db->safesql($val);
				$key = $db->safesql($key);
				$pe_filter_arr[$key][] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) = '{$val}'";
			}
			$where_pe_arr[] =  "(" . implode(' OR ', $pe_filter_arr[$key]) . ")";
		}
		else
		{
			foreach($value as $index => &$val)
			{
				$val = $db->safesql($val);
				$key = $db->safesql($key);
				$xf_filter_arr[$key][] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) LIKE '%{$val}%'";
			}
			$where_xf_arr[] =  "(" . implode(' OR ', $xf_filter_arr[$key]) . ")";
		}
	}
	elseif($value != NULL && $value != "" && !is_array($value))
	{
		if(substr_count( $key, 'r-' ) > 0)
		{
			$name_xf = str_replace('r-', '', $key);
			$name_xf = $db->safesql($name_xf);
			$value = explode( ";", $value);
			$value[1] = $db->safesql($value[1]);
			$value[0] = $db->safesql($value[0]);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )>=$value[0] AND SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )<=$value[1]";
		}
		elseif(substr_count( $key, 'from-' ) > 0)
		{
			$name_xf = str_replace('from-', '', $key);
			$name_xf = $db->safesql($name_xf);
			$value = $db->safesql($value);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )>=$value";
		}
		elseif(substr_count( $key, 'to-' ) > 0)
		{
			$name_xf = str_replace('to-', '', $key);
			$name_xf = $db->safesql($name_xf);
			$value = $db->safesql($value);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$name_xf}|', -1 ) ,  '||', 1 )<=$value";
		}
		elseif(substr_count( $key, 'l.' ) > 0)
		{
			$key = $db->safesql(str_replace("l.","",$key));
			$value = $db->safesql($value);
			$where_from[] = "{$key} LIKE '%{$value}%'";
		}
		elseif(substr_count( $key, 'm.' ) > 0)
		{
			$key = $db->safesql(str_replace("m.","",$key));
			$value = $db->safesql($value);
			$where_from[] = "{$key} REGEXP '[[:<:]](". str_replace(',', '|', $value) .")[[:>:]]'";
		}
		elseif(substr_count( $key, 's.' ) > 0)
		{
			$key = str_replace("s.", "", $key);
			$key = $db->safesql($key);
			$value = $db->safesql($value);
			$where_from[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) = '{$value}'";
		}
		else
		{
			$key = $db->safesql($key);
			$value = $db->safesql($value);
			$where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$key}|', -1 ) ,  '||', 1 ) LIKE '%{$value}%'";
		}
	}
}
if($where_from)
{
	$where_from = implode( " AND ", $where_from);
	$where[] = $where_from;
}

if($where_xf_arr)
{
	$where_xf_arr = implode( " AND ", $where_xf_arr);
	$where[] = $where_xf_arr;
}

if($where_pe_arr)
{
	$where_pe_arr = implode( " AND ", $where_pe_arr);
	$where[] = $where_pe_arr;
}

if($where_like_arr)
{
	$where_like_arr = implode( " AND ", $where_like_arr);
	$where[] = $where_like_arr;
}

if($where_match_arr)
{
	$where_match_arr = implode( " AND ", $where_match_arr);
	$where[] = $where_match_arr;
}

if ( $_REQUEST['cstart'] > 0)
{
	$cstart = intval($_REQUEST['cstart']);
	$cstart = $cstart - 1;
	$cstart = $cstart * $config['news_number'];
}
else
{
	if($filter_nav)
	{
		$cstart = $page_ajax - 1;
		$cstart = $cstart * $config['news_number'];
	}
	else
		$cstart = 0;
}

$sortby_arr = array(
	"date",
	"title",
	"comm_num",
	"news_read",
	"autor",
	"category",
	"rating"
);

$order_by = $form_field_arr["order_by"];
$order = $form_field_arr["order"];
if($order_by)
{
	if(in_array($order_by, $sortby_arr))
		$order_by = " ORDER BY  " . $db->safesql($order_by);
	else
		$order_by = " ORDER BY SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$order_by}|', -1 ) ,  '||', 1 ) ";
	if(($order == "desc" || $order == "asc") && $order_by)
		$order_by .= " " . $order;
}
$cat = $form_field_arr["cat"];
if($cat)
{
	$cat = explode(",", $cat);
	foreach($cat as $key => $value)
		$cats[] = $db->safesql($value);
	$allow_category = ($config['version_id'] >= '10.2') ? $config['allow_multi_category'] == '1' : $config['allow_multi_category'] == "yes";
	if( $allow_category ) 	$where[] = "category REGEXP '[[:<:]](" . implode("|", $cats) . ")[[:>:]]'";
	else 					$where[] = "category IN ('" . implode(",", $cats) . "')";
}
if(count($where))
	$where = " AND " . implode(" AND ", $where);
else
	$where = "";

$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE approve=1" . $where;

if($order_by)
	$where .= $order_by;

$where .= " LIMIT {$cstart},{$config[news_number]}";
$sql_select = "SELECT p.id, p.autor, p.date, p.short_story, p.full_story as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE approve=1 {$where}";

$allow_active_news = TRUE;
$category_id = true;
$req_to_page = array();
foreach($form_field_arr as $key => $val)
	$req_to_page[] = $key . "=" . $val;
$req_to_page = implode("/", $req_to_page);
if($cstart == 0)
	$url_page = $config['http_home_url'] . "f/" . $req_to_page;
else
{
	$url_page = explode("/page", $req_to_page);
	$url_page = $config['http_home_url'] . "f/" . $url_page[0];
}
$nav_set = true;
$back_cat_info = $cat_info[$category_id]['short_tpl'];
if(isset($form_field_arr["tsn"]) && !is_null($form_field_arr["tsn"]))
	$cat_info[$category_id]['short_tpl'] = "field_search/{$form_field_arr[tsn]}";
else
	$cat_info[$category_id]['short_tpl'] = "field_search/field_search_news";
include ENGINE_DIR . '/modules/show.short.php';
$cat_info[$category_id]['short_tpl'] = $back_cat_info;
?>

Я так думаю за это отвечает данный код:
if( $allow_category ) 	$where[] = "category REGEXP '[[:<:]](" . implode("|", $cats) . ")[[:>:]]'";
	else 					$where[] = "category IN ('" . implode(",", $cats) . "')";
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
Например: "работа", "работа на дому", "работа по найму" - из всех этих он должен найти только то, у которого лишь точное слово поиска "работа" без всяких "работа на дому" и так далее.

WHERE category='работа'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы