Удаление повторяющихся слов mysql concat_ws
У меня есть запрос, в котором я выбираю данные, необходимые для индекса сфинкса. Одна из вещей, которые я делаю, - это concat_ws из нескольких псевдонимов имен, разных языков и тому подобное. Это создает проблему, когда имена перекрываются. Например: одна запись имеет имена "Clannad" и альтернативное название "CLANNAD -クラナド-". У другого есть названия "Кланнад после истории", "lan ラナド アフターストーリー" и "Кланнад: после истории". А теперь терпите меня, потому что я знаю, что это будет легко решено в данном конкретном случае, но я бы хотел, чтобы это было применимо по всей доске. Если вы будете искать "Clannad", вы сначала получите запись After Story из-за двойного совпадения на "Clannad".
Я хотел бы удалить все повторяющиеся / неуникальные слова в выражении concat_ws. Если это даже возможно.
Запрос выглядит примерно так:
SELECT CONCAT_WS(' ',a.Name,a.Name2,a.Name3,a.Name4) AS name
(Надеюсь, я правильно сформулировал этот вопрос, это мой первый вопрос здесь) Спасибо,
1 ответ
Как предложил Марк в комментарии, это довольно болезненно в SQL (насколько я вижу). Я бы предложил кэшировать обработанное значение в другом столбце, а затем индексировать его.
SELECT a.name_words AS name, ...
Объединение каждого из значений вашего имени, а затем получение отдельных слов - это отдельный вопрос, но это действительно зависит от того, какой язык у вас под рукой. Регулярные выражения должны быть полезны - вот небольшая попытка в Ruby:
[name, name2, name3, name4].join(' ').split(/\b/).reject { |word|
word.blank?
}.collect { |word|
word.downcase
}.uniq