pg数据库模糊搜索, 和根据匹配排序


常用模糊搜索,一般是, 
1. 搜索字段内容里面是否包含某关键字.  比如: 
Word.where("name ilike ? ", "%abcd%")

2. 搜索字段是否在给要搜索的这段字符串里面.比如:
Word.where("position(name in "abcd") > 0")
select * from  words where position(name in 'abcd') > 0

3.根据匹配的单词的长度排序:
Word.where("name ilike ? ", escape_search_term(@txt))
.order("char_length(name)")) 

def escape_seach_term(term)
  # pg里面不能包含奇数个单引号
  term = term.gsub(/'+/, "''")    
  "%#{term.gsub(/\s+/, '%')}%" 
end

4.根据匹配的位置前后排序:
Word.select("name, strpos(name, '#{@search_txt}') as loc")
.where("name ilike ? ", escape_search_term(@txt))
.order("loc")) 

获取搜索的内容在字段里面的位置:pgSql里面是strpos(), MySql里面是instr(), locate(),等类似函数。

5.优先匹配位置,再根据单词长度排序:
Word.select("name, char_length(name) as len, strpos(name, '#{@search_txt}') as loc")
.where("name ilike ? or ? =ANY(tags)", escape_search_term(@search_txt), @search_txt)
.order("loc, len")

6.查询单词包含哪些前缀:strops 类似position(), 
# 前缀不能在最后

Prefix.where("position(name in '#{word}') > 0 and 
position(name in '#{word}') <= (#{word.length} - LENGTH(name))")

7. 搜索相似 similar
Post.where("content similar to ? ", helpers.pg_similar_search(txt))

#有些单词在首位通过下面这在方式ok。
def pg_similar_search(txt)
    return "%\\m(#{txt.downcase}|#{txt.upcase}|#{txt.titlecase})\\M%"
end
阅读量: 1463
发布于:
修改于: