Удаление повторяющихся слов 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
Другие вопросы по тегам