Например, у меня есть php-массив $php_arr_to_check = array("green", "red", "blue");
И так много строк mysql, как это
Id | TextToCheckIn ______________________ 1 | green brown blue 2 | black yellow white red 3 | yellow green black red grey white
Хотелось бы, чтобы петля $php_arr_to_check
через каждую строку в столбце TextToCheckIn
и возвращала Id
где, например, в $php_arr_to_check
существует, по крайней мере, 2 слова из $php_arr_to_check
TextToCheckIn
.
Является ли это возможным? Существует ли какая-либо функция mysql?
Вот пример с php (что я хочу получить)
$php_arr_to_check = array("green", "red", "blue"); echo '<pre>', print_r($php_arr_to_check, true), '</pre> php_arr_to_check <br/>'; $mysql_rows = array( array("green", "brown", "blue"), array("black", "yellow", "white", "red"), array("yellow", "green", "black", "red", "grey", "white") ); echo '<pre>', print_r($mysql_rows, true), '</pre> mysql_rows <br/>'; foreach( $mysql_rows as $one_row ){ //echo count(array_intersect($php_arr_to_check, $one_row)). ' count array_intersect __ <br/>'; if( count(array_intersect($php_arr_to_check, $one_row)) > 1 ){ $arr_with_count_matches[] = count(array_intersect($php_arr_to_check, $one_row)); $maches_exist = true; } } echo '<pre>', print_r($arr_with_count_matches, true), '</pre> arr_with_count_matches <br/>';
Хотите получить тот же результат, сравнивающий php-массив с столбцом mysql.
Любые идеи, как это сделать (без LIKE
)? Может быть, с MATCH AGAINST
каким-то образом?
Прежде чем я использовал ниже, но получил как бы ложные срабатывания ….
SELECT Id FROM table WHERE MATCH (TextToCheckIn) AGAINST (?) LIMIT 1
Попытаюсь
SELECT Id FROM table WHERE MATCH (SUBSTRING_INDEX(TextToCheckIn, ' ', 3)) AGAINST (?) LIMIT 1
Как понимаю, я TextToCheckIn
первые 3 слова в TextToCheckIn
с php-массивом. Но не понимаю, что я получу. Чтение здесь http://www3.physnet.uni-hamburg.de/physnet/mysql/manual_Fulltext_Search.html
Для каждой строки таблицы возвращается релевантность – мера подобия между текстом в этой строке (в столбцах, которые являются частью коллекции) и запросом.
Кажется, это именно то, что необходимо … нужно проверить
Я думаю, вы хотите использовать Boolean Full-Text Search
Если вы играете без операторов +
-
против green red blue
все строки возвращаются, где в записи содержится хотя бы одно слово: green
или red
или blue
.
IN BOOLEAN MODE
и без операторов каждое совпадающее слово забьет 1
. Поэтому, если есть запись, соответствующая двум из трех слов, она набрала бы 2
.
Чтобы получить строки, имеющие как минимум 2 балла:
SELECT *, MATCH (`TextToCheckIn`) AGAINST ('green red blue' IN BOOLEAN MODE) `score` FROM `my_tab` WHERE MATCH (`TextToCheckIn`) AGAINST ('green red blue' IN BOOLEAN MODE) HAVING `score` >= 2 ORDER BY `score` DESC
В режиме естественного языка скоринг работает совершенно по-другому. Думайте, что это в первую очередь основано на BM25 .
В больших наборах данных логический полнотекстовый поиск (с использованием полнотекстового индекса ) обычно превосходит REGEXP
или LIKE
, если сопоставить слова где-то в тексте. Используется только как / regexp для сопоставления с исходным, например REGEXP '^word'
или LIKE 'word%'
– если индекс может быть использован.
У меня нет MySQL для проверки следующего запроса. Вы попробуете что-нибудь:
SELECT Id, TextToCheckIn REGEXP "(${word1})|(${word2})" AS Flag FROM table WHERE Flag = 1