如何快速匹配条目与长字符串的开头



我有一个表articles (:Rails模型,但我认为这个问题更多的SQL相关),它有一个列名permalink。例如,我的一些永久链接:

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

我想匹配像great-article-about-obama-random-stuffgreat-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"的文章,

由于请求的数量,这不是最优的,但是如果它只是一个查找,而不是访问记录的正常方式,那就不是那么重了。

相关内容

  • 没有找到相关文章

最新更新