Я следую за Rails Bates Railscast при полнотекстовом поиске с Postgres, однако он использует postgres 9.1, и я использую 9.2. Он выполняет следующий запрос для выполнения поиска. Это работает для меня, если мой запрос - это одно слово, например «супермен», но если это два слова, например dc comics
, или super man
, я получаю эту ошибку, которая была просто новой для postgres. Я не могу понять, как исправить. Вы можете помочь?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
Спасибо за вашу помощь. Однако я завернул ': q' дважды, как вы видите здесь, хотя он не прерывается при поиске по двум словам, например' was was ', он не возвращает никаких результатов, даже если '' 'существовал' в содержание моего db. это то, что вы ожидаете? в любом случае, чтобы получить результаты поиска по многоязычному поисковому запросу? 'where (" to_tsvector ('english', name) @@ plainto_tsquery (: q) или to_tsvector ('english', content) @@ plainto_tsquery (: q) ", q: query) .order (" # {rank} desc ")' – BrainLikeADullPencil
Читайте на [стоп слова] (http://www.postgresql.org/docs/9.2/static/textsearch-dictionaries.html). Похоже, что «есть» и «были» считаются слишком распространенными в английском словаре, чтобы их индексировать. –
ОК, я вижу. Он возвращает результаты для менее распространенных слов. Благодарю. – BrainLikeADullPencil