Но как бы я соответствовал TST-DFS, если бы пользователь ввел TST DFS?
Мне бы хотелось, чтобы у этого SKU была релевантность, скажем, 8 вместо целых 10 ..
Если я правильно понял вопрос, ответ на самом деле прост.
Что ж, если вы подделаете ваш запрос, прежде чем отправить его в mysql.
Хорошо, давайтескажем, у нас есть $query
, и он содержит TST-DFS
.
Мы собираемся сосредоточиться на диапазонах слов ?Я полагаю, что мы должны, , как и большинство поисковых систем , поэтому:
$ok=preg_match_all('#\w+#',$query,$m);
Теперь , если этот шаблон соответствует ... $m[0]
, содержит список слов в $query
.
Это может быть точно настроено для вашего SKU, но сопоставление с полными словами в стиле AND - это почти то, что предполагает пользователь.(как это происходит в Google и Yahoo)
Затем нам нужно приготовить выражение $expr
, которое будет введено в наш последний запрос.
if(!$ok) { // the search string is non-alphanumeric
$expr="false";
} else { // the search contains words that are no in $m[0]
$expr='';
foreach($m[0] as $word) {
if($expr)
$expr.=" AND "; // put an AND inbetween "LIKE" subexpressions
$s_word=addslashes($word); // I put a s_ to remind me the variable
// is safe to include in a SQL statement, that's me
$expr.="word LIKE '%$s_word%'";
}
}
Теперь $expr
должно выглядеть следующим образом: "words LIKE '%TST%' AND words LIKE '%DFS%'"
С этим значением мы можем построить окончательный запрос:
$s_expr="($expr)";
$s_query=addslashes($query);
$s_fullquery=
"SELECT (Product,word,if((word LIKE '$s_query'),relevancy,relevancy-2) as relevancy) ".
"FROM some_index ".
"WHERE word LIKE '$s_query' OR $s_expr";
, который будет читать"TST-DFS":
SELECT (Product,word,if((word LIKE 'TST-DFS'),relevancy,relevancy-2) as relevancy)
FROM some_index
WHERE word LIKE 'TST-DFS' OR (word LIKE '%TST%' AND word LIKE '%DFS%')
Как видите, в первой строке SELECT
, , если совпадение является частичным, mysql вернет релевантность-2
В третьем предложении WHERE
, , если полное совпадение не удается, $s_expr
, запрос на частичное совпадение, который мы подготовили заранее , вместо этого.