У меня есть запрос на полный текст, который, похоже, работает с орфографическими ошибками, если я использую 2 слова, но это не так, если я использую только одно слово
У меня есть таблица с полем fullname
И в таблице "Нил Роджерс", "Бам Роджерс", "Кэтрин Вин Роджерс", "Найджел Роджерс",
мой запрос
SELECT *
FROM people
WHERE MATCH (fullname) AGAINST ('myquerytext' IN NATURAL LANGUAGE MODE)
если я ищу "Роджерса", я нашел "Нил Роджерс"
если я ищу "Роджерса", я нашел "Бам Роджерс", "Кэтрин Вин Роджерс", "Найджел Роджерс", НО НЕ "Нил Роджерс",
если я ищу "Нил Роджерс", я люблю "Нил Роджерс", "Бам Роджерс", "Кэтрин Вин Роджерс", "Найджел Роджерс",
Можно ли настроить допуск?
Ваша проблема в том, что он ищет EITIER Nile OR Rogers, и поэтому результаты, которые вы получаете, логичны.
Если вы хотите ВСЕ слова, а не ЛЮБОЙ из них, используйте BOOLEAN MODE и добавьте +
перед каждым словом:
SELECT *
FROM people
WHERE MATCH (fullname) AGAINST ('+Nile +Rogers' IN BOOLEAN MODE)
12.9.2 Логические полнотекстовые поисковые запросы
При реализации этой функции MySQL использует то, что иногда называют логической логикой, в которой
• + обозначает И
• - означает НЕ
• [нет оператора] подразумевает ИЛИ
'Nile Rogers'
возвращает все записи не потому, что MySQL обрабатывает альтернативные варианты написания, а потому, что все записи соответствуют одному из этих двух токенов. См. Stackoverflow.com/questions/7200935/… . Если вы хотите обрабатывать альтернативные орфографические / орфографические ошибки в MySQL, вы можете сделать что-то вроде создания индекса SOUNDEX. Если переключение СУБД является опцией, Postgres имеет встроенную поддержку n-граммы слова, которую вы можете использовать для сравнения слова с его ошибочным эквивалентом.