Postgres 全文与 Rails 3 中的部分单词不匹配?

发布于 2024-10-18 16:35:28 字数 628 浏览 2 评论 0原文

我刚刚从 MySQL 迁移到 Postgres 9.0.3。我有一个全新的应用程序,其中有一些数据(游戏数据)。

无论如何,我似乎无法搜索到部分单词。这是我的搜索方法:

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ plainto_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query])    
end

我确信我需要一个通配符,但我刚刚学习 Postgres。

当我搜索 Shinobi 时,我得到了正确的结果:

忍者世界中的亚历克斯·基德 - 世嘉大师系统

Shinobi - 世嘉大师系统

Shinobi - 任天堂娱乐系统

网络忍者:忍者第 2 部分 - Sega Master 系统

但是当我搜索 Shin 时我什么也没得到?

感谢您提供任何线索。

I just moved from MySQL to Postgres 9.0.3. I have a brand new app with a little data (game data).

Anyway, I can't seem to get partial words to search. Here is my search method:

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ plainto_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query])    
end

I'm sure I need a wildcard in there but I'm just learning Postgres.

When I search for Shinobi I get the correct results:

Alex Kidd in Shinobi World - Sega Master System

Shinobi - Sega Master System

Shinobi - Nintendo Entertainment System

The Cyber Shinobi: Shinobi Part 2 - Sega Master System

But when I search for Shin I get nothing?

Thanks for any clues.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

寄人书 2024-10-25 16:35:28

我认为要允许前缀匹配,您需要使用 to_tsquery 而不是 plainto_tsquery

,它表示 http://www.postgresql.org/docs/current/static/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

所以你的代码可能是这样的

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ to_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query + ':*'])
end

I think that to allow prefix matching you need to use to_tsquery instead of plainto_tsquery

that says http://www.postgresql.org/docs/current/static/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

so your code could be something like

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ to_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query + ':*'])
end
本宫微胖 2024-10-25 16:35:28

您还可以使用正则表达式搜索,如下所示。

find( :all, :conditions => [ 'name ~* ?', "SEARCH TERM" ] )

You can also use a regular expression search as shown below.

find( :all, :conditions => [ 'name ~* ?', "SEARCH TERM" ] )
流星番茄 2024-10-25 16:35:28

* 附加到您的查询字符串。

搜索 Shin*

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ plainto_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query.concat("*")])    
end

Append a * to your query string.

Search for Shin*.

def self.search(query)
  conditions = <<-EOS
    to_tsvector('english', title) @@ plainto_tsquery('english', ?)
  EOS

  find(:all, :conditions => [conditions, query.concat("*")])    
end
眼波传意 2024-10-25 16:35:28

使用前缀

  pg_search_scope :search, against: [:name, :email],
    using: {tsearch: {prefix: true}}

Use the prefix:

  pg_search_scope :search, against: [:name, :email],
    using: {tsearch: {prefix: true}}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文