Итак, вот ситуация:
Мне нужно найти способ сопоставить 2 одинаковые строки, например:
а — SAMSUNG Galaxy S5 White
б — Mobile phone SAMSUNG GALAXY S5 WHITE
У меня есть строка a
в поле базы данных, теперь у меня есть и эквивалентная строка, поступающая из внешнего источника. Таким образом, очевидно, что это тот же продукт, но если я сделаю прямой поиск по названию поля, поиск не даст желаемых результатов.
Любые идеи, как я мог бы сделать поиск, который будет искать похожие строки?
Может быть, разбить строку на токены? Есть ли какой-нибудь запрос, который я напишу, который будет выглядеть по этим токенам? Будет ли полезна в этом сценарии функция поиска ngram, представленная в MySQL 5.7.6?
Любые другие предложения?
С помощью LIKE
как описано в других ответах, не сработает, потому что искомый текст не является подстрокой того, что находится в базе данных (в вашем примере). Есть несколько способов справиться с этим, в зависимости от вашей ситуации.
Если вы заранее знаете различные переменные строки, которые вам могут быть предоставлены, вы можете создать другую таблицу aliases
сохранить эти строки и связать их с первичной таблицей с помощью внешнего ключа.
Если вы не знаете их заранее, возможно, из-за того, что они являются пользовательскими поисковыми терминами, вам нужно будет динамически создать запрос, который будет разбивать термины, и искать их по отдельности, например так:
SELECT ...
FROM table
WHERE field LIKE '%Mobile%'
OR field LIKE '%phone%'
OR field LIKE '%SAMSUNG%'
OR field LIKE '%GALAXY%'
OR field LIKE '%S5%'
OR field LIKE '%WHITE%'
Хотя что-то подобное найдет правильный результат, оно также может вернуть ложные срабатывания (т. Е. Все, что имеет слово «белый» или «телефон», также будет возвращено), так что это, вероятно, не тот путь.
Если вы используете таблицы MyISAM с MySQL <= 5.5, или таблицы MyISAM или InnoDB с MySQL> = 5.6, вы можете использовать полнотекстовый поиск и сопоставлять / сравнивать, например так:
SELECT MATCH( field ) AGAINST ( 'Mobile', 'phone', 'SAMSUNG', 'GALAXY', 'S5', 'WHITE' ) as relevance
FROM table
WHERE MATCH( field ) AGAINST ( 'Mobile', 'phone', 'SAMSUNG', 'GALAXY', 'S5', 'WHITE' IN BOOLEAN MODE)
ORDER BY relevance DESC
Это не только найдет подходящие строки, но и отсортирует их по релевантности (то есть, сколько совпадений). Вы можете ограничить это 1 строкой, если вы знали, что наиболее релевантное совпадение было правильным, или вы могли бы отобразить список вариантов, начиная с наиболее релевантного.
Проверьте страницу документации для Функции полнотекстового поиска для получения дополнительной информации.
Используйте SQL:
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE %pattern%;
Это выберет из вашего имени столбца, как вы значение. Подстановочный знак %
является заменой для нуля или более символов. Вот некоторые документация из like
Проверка «Нравится» может быть полезной mysql Like
Вы можете написать так:
SELECT column_name
FROM table_name
WHERE column_name LIKE %key%;
Вы получите результат, что column_name содержит ключ.