Как сопоставить строку, содержащую запятую в MySQL

#mysql #match #against

#MySQL #Сопоставление #против

Вопрос:

Наша база данных содержит много записей с запятой в их названиях (как и в венгерском, это десятичный разделитель вместо точки), и мы хотели бы сопоставить их с правильной релевантностью. Поиск SQL выглядит следующим образом в настоящее время в случае введенных пользователем терминов 7,5×20 otherTerm

 SELECT (MATCH(title) AGAINST('( 7,5x20*  otherTerm* ) (7,5x20* otherTerm* ) ( 7,5x20  otherTerm )' IN BOOLEAN MODE)) AS Relevance,
id, title, product_id FROM versions

WHERE (MATCH(title) AGAINST('( 7,5x20*  otherTerm* ) (7,5x20* otherTerm* ) ( 7,5x20  otherTerm )' IN BOOLEAN MODE))

ORDER BY Relevance DESC LIMIT 50
 

Теперь порядок результатов дает более высокую актуальность, например. 5×20, чем 7,5×20, поэтому для запятой должен быть какой-то экранирующий символ, чтобы MySQL не обрабатывал их как разделенные строки. Я не нашел правильного.

Заранее спасибо за любую помощь.

Редактировать: разборка заголовка на более удобоваримые данные в настоящее время невозможна. Действительно ищу решение, исключающее запятую или заменяющее ее на оператор ‘сопоставить любой одиночный символ’, например, точку в регулярном выражении.

Комментарии:

1. Подумайте о том, чтобы не хранить данные с разделителями, если затем вы захотите выполнить запрос к этим данным.

2. Чтобы, возможно, сделать комментарий Strawberry немного более полезным, когда вы сохраняете число, сохраняйте его как число. Я не очень хорошо понимаю вашу схему здесь, но я думаю, вам будет полезно разложить ваши данные на их корневые значения и попрощаться с причудами сопоставления с естественным языком.

3. Честно говоря, я думаю, что пример хороший, потому что он показывает, что вы пытаетесь втиснуть слишком много информации в одно поле базы данных. У вас есть большая строка, которая содержит много информации. Вам нужно разбить эту информацию и описать ее с помощью определений таблиц вашей базы данных. Как только вы это сделаете, взойдет солнце, запоют птицы, и вы внезапно почувствуете силу управления своей информацией.

4. Тот факт, что запятая находится в числе, является отвлекающим маневром. Если я понимаю, вы хотите, чтобы она соответствовала фразе «Я думаю, следовательно, я есть» с более высокой релевантностью для «я думаю, следовательно, я есть», чем с «я думаю, следовательно, я есть». Но оператор СОПОСТАВЛЕНИЯ игнорирует символы, не являющиеся словами. Вы должны быть в состоянии сделать это с помощью ЗАМЕНЫ внутри синтаксиса сопоставления, например, MATCH(REPLACE(title , «,», «Q») ПРОТИВ(‘(» 7Q5x20 otherTerm * ) …

5. Действительно, похоже, что оператор СОПОСТАВЛЕНИЯ не может принимать поля с предыдущими псевдонимами в качестве входных данных и использовать в качестве входных данных что-либо, кроме имени поля. Итак, чтобы использовать этот метод, вы возвращаетесь к созданию промежуточного представления с замененными результатами, а затем запускаете сопоставление в этом представлении.

Ответ №1:

FULLTEXT индексация не предназначена для обработки чисел, независимо от локали для чисел.

Один из подходов заключается в изменении входящего текста для замены знаков препинания, которые вы хотите рассматривать как «буквы», скажем, _ . (И создайте отдельный столбец для хранения этого измененного текста. Затем добавьте к FULLTEXT ней индекс вместо «реального» текста.)

Пожалуйста, обратите внимание, что это x приведет к сбою в плохом смысле — строки из одного символа не индексируются, поэтому их невозможно найти. Таким образом, включение строк, которые являются двумя короткими, приводит к возврату нулевых совпадений.

Изменения в сохраненном тексте (например, 7_5x20 ) также должны применяться к поиску.

50 тысяч строк? Напишите специальный одноразовый скрипт для выполнения вышеупомянутого преобразования в существующие 50 тыс. строк. Затем включите преобразования как в вставки, так и в выборки.