Как быстро сопоставить запись с началом длинной строки? - PullRequest
3 голосов
/ 05 мая 2011

У меня есть таблица articles (: модель Rails, но я думаю, что проблема связана с SQL), которая имеет имя столбца permalink. К примеру, некоторые из моих постоянных ссылок:

title-of-article
great-article
great-article-about-obama
obama-stuff-about-him

Я хочу сопоставить запрос от great-article-about-obama-random-stuff до great-article-about-obama. Можно ли это сделать, избегая убийственного выступления?

Спасибо всем,

ps: мы используем Rails 3 и Postgresql (или Sqlite, еще не решенный для производства)

EDIT

Мы можем сделать что-то подобное, но главный недостаток в том, что мы должны получать все постоянные ссылки из статей таблицы:

permalinks = ['title-of-article','great-article','great-article-about-obama','obama-stuff-about-him']
string_to_match = 'great-article-about-obama-random-stuf'
result = permalinks.inject('') do |matched,permalink|
  matched = (string_to_match.include? permalink and permalink.size > matched.size) ? permalink : matched
end
result => 'great-article-about-obama'

Я с удовольствием найду способ сделать это непосредственно в SQL по очевидной причине производительности.

1 Ответ

2 голосов
/ 05 мая 2011

Если не используется базовая технология текстового поиска (с postgres: http://www.postgresql.org/docs/8.3/static/textsearch-dictionaries.html + http://tenderlovemaking.com/2009/10/17/full-text-search-on-heroku/ или solr, indexTank), вы можете сделать это с помощью:

request = "chien-qui-aboie"
article = nil

while !article do
  article = Article.where("permalink like ?", request+"%").select(:id).first
  request.gsub!(/-[^-]*$/) unless article
end

Сначала будет выглядеть chien-qui-aboie% , затем chien-qui% , затем chien% .

Это также будет соответствовать "chien_qui_mange", если есть статья "chien_qui_mange", но никто не о "chien qui aboie"

Это не оптимально из-за количества запросов, но это не так сложно, если это просто поиск, а не обычный способ доступа к записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...