Я прочитал довольно много похожих постов, но ни один не решает мой случай, что вполне может быть из-за моего недостатка знаний, поэтому, пожалуйста, потерпите меня.
Один из вариантов поиска в моем терминологическомсловарь "только целые слова".Сначала я использовал
WHERE ".$source." RLIKE '[[:<:]]".$keyword."[[:>:]]'
Однако это не соответствовало целым словам для первого или второго $keyword
, когда их больше одного.Затем я нашел
WHERE ".$source." REGEXP '[[:<:]]".$keyword."[[:>:]]'
и
WHERE ".$source." REGEXP '(^| )".$keyword."( |$)'
при поиске этих форумов
Я только что проверил оба из вышеперечисленных в своем PhpMyAdmin и нашелиз-за того, что первый выполняется за 0,0740 секунд, а второй - вдвое дольше, 0,1440 секунд, так что, думаю, мне следует придерживаться первого.
Больше всего меня беспокоит огромное расхождение в результатах, например, поискдля одного слова («инструмент»):
Использование границы слов [[:<:]]
и [[:>:]]
в PhpMyAdmin возвращает 34 результата.
Использование (^| )
и ( |$)
в PhpMyAdmin возвращает 26 результатов.
Выполнение регулярного выражения # 1 в моем PHP-скрипте возвращает 34 результата (это правильное число).
Вот весь блок MySQL:
foreach($keywords as $keyword) {
$query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " .
"JOIN ".DICTIONARY_THEMES." ON ".DICTIONARY_TABLE.".theme_id = ".DICTIONARY_THEMES.".theme_id ".
"LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".term_id = ".DICTIONARY_DEFINITIONS.".term_id ".
"WHERE ".DICTIONARY_TABLE.".".$source." REGEXP '(^| )".$keyword."( |$)'".
//"WHERE ".DICTIONARY_TABLE.".".$source." REGEXP '[[:<:]]".$keyword."[[:>:]]'".
" ORDER BY ".DICTIONARY_TABLE.".theme_id, ".DICTIONARY_TABLE.".".$source."");
}
Я прокомментировал опцию поиска, которую я не использую.
Теперь, если я попробую ДВАключевые слова, например, «режущий инструмент», я все еще получаю 34 результатов на странице.Я не уверен, что я делаю это правильно в PhpMyAdmin:
SELECT * FROM `asphodel_dictionary_terms` WHERE english REGEXP '[[:<:]]cutting[[:>:]]';
SELECT * FROM `asphodel_dictionary_terms` WHERE english REGEXP '[[:<:]]tool[[:>:]]'
Это возвращает 44 результата для "резки" и 34 результата для "инструмента".Запрос с использованием (^| )
... возвращает 37 + 26 результатов соответственно.
Любая обратная связь, которая поможет мне разобраться, будет принята с благодарностью!
База данных содержит в общей сложности 109 000 записей вВ основной таблице 82 таблицы в таблице DICTIONARY_THEMES
и 727 записей в таблице DICTIONARY_DEFINITIONS
.Не огромная база данных, и она не станет намного больше.