Мой код позволяет выполнять поиск, если порядок слов правильный.
Скажем, я ищу big dog
, но я также хочу найти dog big
. Это усложняется тремя или более словами.
Есть ли способ создать SQL-запрос, который позволит мне искать значения в любом порядке?
Только так я могу думать об этом, имея несколько запросов, где я вручную меняю порядок переменных PHP...
<?php
if(isset($_GET['query']) && !empty($_GET['query'])) {
$query = $_GET['query'];
$query_array = explode(' ', $query);
$query_string = '';
$query_counter = 1;
foreach($query_array as $word) {
$query_string .= '%' . $word . (count($query_string) == $query_counter++ ? '%' : '');
}
$query = "SELECT * FROM pages WHERE Name LIKE '$query_string'";
$result = sqlsrv_query($cms->conn, $query);
while($row = sqlsrv_fetch_array($result)) {
extract($row);
echo '<a href="'.$Address.'.html">'.$Name.'</a><br>';
}
sqlsrv_free_stmt($stmt);
}
else {
//echo 'NO GET';
}
?>
Вы можете собрать свои условия и проверить каждое слово:
$query_array = explode(' ', $query);
$queryParts = array();
foreach ($query_arra AS $value){
$queryParts[]="Name like '%".mysql_real_escape_string($value)."%'";
}
$searchString = implode(" AND ", $queryParts);
Строка поиска теперь будет Name like '%big%' AND Name like '%dog%'
... в зависимости от того, сколько поисковых ключевых слов было там.
Я использую тот же подход очень часто, также когда требуется, чтобы ВСЕ ключевые слова отображались как минимум в одном столбце. Затем вам понадобится еще один цикл для создания необходимых условий AND
:
$search = "Big Dog";
$keywords = explode (" ", $search);
$columns = array("Name", "description");
$andParts = array();
foreach ($keywords AS $keyword){
$orParts = array();
foreach($columns AS $column){
$orParts[] = $column . " LIKE '%" . mysql_real_escape_string($keyword) . "%'";
}
$andParts[]= "(" . implode($orParts, " OR ") . ")";
}
$and = implode ($andParts, " AND ");
echo $and;
это создало бы часть запроса (Name like '%Big%' OR description like '%Big%') AND (Name like '%Dog%' or description like '%Dog%'
)
Таким образом, он найдет любую строку, где dog
и big
фигура появляются, по крайней мере, в одном из name
или description
столбцов (также могут быть как в одном столбце)
Поскольку ваш первоначальный запрос является чем-то вроде %big%dog%
, поэтому я предполагаю, что вы в порядке с соответствующей big wild dog
. В этом случае вы можете просто использовать оператор AND
.
(Name LIKE '%big%" and Name LIKE '%dog%")
and like '%%'
Вероятно, вам было бы лучше использовать полнотекстовый поиск, я бы подумал, что в подобных ситуациях.
Одна вещь, которую вы могли бы изучить, - это полный поиск текста для ms sql-сервера.
https://msdn.microsoft.com/en-us/library/ms142571.aspx
он похож на "поисковую систему" на то, что он работает с алгоритмом для ранжирования результатов и даже подобных слов (например, поиск типа тезауруса)
Это не совсем тривиально настроить, но достаточно легко найти учебник по этому вопросу и как запросить у FTS (поскольку синтаксис отличается от того, что LIKE "% big% dog%")
Здесь пример запроса со страницы, указанной выше:
SELECT product_id
FROM products
WHERE CONTAINS(product_description, "Snap Happy 100EZ" OR FORMSOF(THESAURUS,Snap Happy) OR ‘100EZ)
AND product_cost < 200 ;
myisam поддерживает полнотекстовый поиск: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html