【问题标题】:postgres search query error if space used如果使用了空间,postgres 搜索查询错误
【发布时间】:2013-05-04 03:31:24
【问题描述】:

我正在跟随 Ryan Bates 的 Railscast 使用 Postgres 进行全文搜索,但是,他使用的是 postgres 9.1,而我使用的是 9.2。他构建以下查询来执行搜索。如果我的查询是一个词,例如“超人”,它适用于我,但如果它是两个词,例如 dc comicssuper man,我会收到此错误,这对于 postgres 来说是新的,我可以不知道如何解决。你能帮忙吗?

PG::Error: ERROR:  syntax error in tsquery: "super man"
LINE 1: ...articles"  WHERE (to_tsvector('english', name) @@ 'super man...
                                                             ^
: SELECT  "articles".* FROM "articles"  WHERE (to_tsvector('english', name) @@ 'super man' or to_tsvector('english', content) @@ 'super man') ORDER BY       ts_rank(to_tsvector(name), plainto_tsquery('super man')) +
      ts_rank(to_tsvector(content), plainto_tsquery('super man'))
 desc LIMIT 3 OFFSET 0

来自 Article.rb 的查询

 def self.text_search(query)
    if query.present?
      rank = <<-RANK
      ts_rank(to_tsvector(name), plainto_tsquery(#{sanitize(query)})) +
      ts_rank(to_tsvector(content), plainto_tsquery(#{sanitize(query)}))
    RANK

  where("to_tsvector('english', name) @@ :q or to_tsvector('english', content) @@ :q", q: query).order("#{rank} desc")

    else
      scoped
    end
  end

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    @@ 用于将tsvectortsquery 进行比较。您正在尝试将 tsvector 与无效的 tsquery 进行比较。

    'superman'text 类型,应该真正包含在对to_tsquery() 的调用中。但是,postgres 似乎试图帮助您并为您强制将其转换为 tsquery,而 to_tsquery('superman') 是一个有效的查询。

    'super man'text 类型,应该真正包含在对to_tsquery() 的调用中。 Postgres未能为您将其强制转换为 tsquery,因为 to_tsquery('super man') 不是有效的查询。一个有效的 tsquery 必须有像 &amp;| 这样的布尔运算符来告诉查询如何处理这些单词。 'super & man' 可能会起作用。

    为了让您不必为简单的 AND 样式查询编写查询,plainto_tsquery 使这更容易一些。在您的情况下,将您的 :q 参数包装在对 plainto_tsquery 的调用中

    plainto_tsquery(:q)
    

    【讨论】:

    • 感谢您的帮助。我将:q 包装了两次,正如您在此处看到的那样,即使它现在在诸如has been 之类的两个单词搜索中没有中断,即使has been 存在于我的内容中,它也不会返回任何结果D b。这是你所期望的吗?无论如何让它检索多词搜索查询的结果? where("to_tsvector('english', name) @@ plainto_tsquery(:q) or to_tsvector('english', content) @@ plainto_tsquery(:q)", q: query).order("#{rank} desc")
    • 阅读stop words。很可能,“has”和“been”在英语词典中被认为太常见了,无法索引它们。
    • 好的,我明白了。它正在返回不太常见的单词的结果。谢谢。
    • 如果您正在进行前缀搜索,这将无济于事
    • 我只是有问题,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2014-05-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多