В сумме
У меня есть два столбца, name и name_searchable.Я хотел бы найти в этих столбцах (которые имеют миллионы строк) и вернуть результаты в соответствии с их частотой совпадений.У меня есть два важных критерия;поиск должен быть эффективным и быстрым.Как мне этого добиться?
Подробнее
Я планирую создать таблицу с миллионами строк.В общем, я создал таблицу дампа просто для проверки запроса с миллионом строк.Таблица использует механизм хранения MyISAM
, ее индекс и первичный ключ - это номер идентификатора.Поиск, который я хотел бы сделать, связан с полем имени, которое является столбцом varchar
.Теперь, основываясь на запросе, я бы хотел вернуть все результаты, которые частично или полностью соответствуют запросу.Поэтому, когда пользователь ищет «björn borg», я хотел бы вернуть оба:
- björn borg
- björn borgus
- bjorn borg (обратите внимание на o)
и так далее ...
Важным фактором здесь является то, что оператор =
всегда должен возвращать более высокий рейтинг, чем оператор LIKE
.Поэтому «björn borg» всегда должен предшествовать «bjorn borgus».
В последнее время я задал вопрос о том, как возвращать результаты в режиме, не учитывающем диакритические знаки, но, к сожалению, я не смог заставить его работать.Поэтому я создал еще один столбец вдоль столбца имени, в котором имя хранится только английскими символами.Итак, у нас есть поля name
и name_searchable
.
Ну, я попробовал все это с помощью хранимой процедуры, но, по-видимому, это очень медленно по сравнению с обычными запросами.Поэтому я хотел бы знать, могу ли я упорядочить результаты в соответствии с тем, какому предложению where они соответствуют.Другими словами:
SELECT * FROM myUsers WHERE name = 'björn borg' OR name_searchable = 'bjorn borg' OR name LIKE '%björn borg%' OR name_searchable LIKE '%bjorn borg%';
В общем, идея состоит в том, чтобы по-разному давать баллы каждому условию.Я имею в виду, что name = 'björn borg' должно иметь ранг, скажем, 5, name_searchable LIKE '% bjorn borg%' должно иметь 2 (а второй 4 балла, третий 3 балла ...) Как я могузаставить это работать, используя MySql?(Эффективность и скорость важны для меня)