В настоящее время у меня есть одно поле поиска для поиска по нескольким столбцам с помощью этого кода:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE ";
$i=0;
foreach ($searchArray as $word) {
if ($i != 0) $query .= " OR ";
$query .= " MATCH (`first_name`, `last_name`, `email`) AGAINST ('".$word."*' IN BOOLEAN MODE)";
$i++;
}
Предположим, что у меня эти две строки в таблице:
id | last_name | first_name | email
1 | Smith | John | [email protected]
2 | Smith | Bob | [email protected]
Если я наберу "John S", будет показан только первый результат, который является желаемым.
Если я наберу "Джон Смит", будет показан только первый результат, который является желаемым.
Если я нахожу "Smith J", оба результата показывают, что Bob не соответствует.
Если я наберу "Смит Джон", оба результата показывают, хотя Боб не соответствует.
Наконец, если я нахожу "Jo S", результаты не возвращаются, несмотря на частичное совпадение на "Jo" и "S".
Может ли кто-нибудь помочь мне исправить мой запрос, чтобы иметь дело с желаемой функциональностью заказа, не являющейся важным и частичным согласованием результатов? Если он может быть отсортирован по лучшим совпадениям (то есть самая длинная часть слова, начиная с первой буквы, а не в середине, в наибольшем числе столбцов), это также будет огромной помощью.
UPDATE:
Просто хотел опубликовать окончательный код, который работал на основе решения. Моя петля, создающая несколько операторов сопоставления, была неправильной, как и моя ft_min_word_len.
Мой код:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE MATCH (`first_name`, `last_name`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";