我有一个表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尚未决定用于生产)
编辑我们可以这样做,但主要的缺点是我们必须从表articles中获取每一个永久链接:
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
中做,因为明显的性能原因。
除非使用文本搜索基础技术(w/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- quie %,然后查找chien- quie %,然后查找chien%。
如果有"chien_qui_mange"的文章,而没有"chien_qui_mange"的文章,
由于请求的数量,这不是最优的,但是如果它只是一个查找,而不是访问记录的正常方式,那就不是那么重了。