Как реализовать расширенный поиск с операторами в pg_search?

Я реализовал PgSearch на моей модели Node следующим образом:

include PgSearch
pg_search_scope :node_search, against: [:name, :user_id, :circa],
    using: { tsearch: { any_word: true} },
    :associated_against => {
      comments: [:message],
      user: [:first_name, :last_name, :email],
      memberships: [:relation]
    }

И в моем контроллере у меня есть это:

if params[:search]
  @nodes = Node.node_search(params[:search])
end

В идеале, что я хотел бы сделать, так это чтобы кто-то мог ввести текстовое представление (флаг) одной из ассоциаций и иметь фильтр поиска только для этого флага.

Например. сказать: "имя: Прыгающий мяч", где поиск будет происходить только в столбце с именем name на модели nodes. Ака... он будет искать все узлы с именем Bouncing Ball, а не искать другие столбцы или модели или даже какие-либо ассоциации.

Естественно, я хотел бы иметь возможность выполнять такие поиски, как: owner: John Brown (который ищет все узлы, чьи имя и фамилия владельца/пользователя — Джон Браун), comment: Manhattan (который ищет все узлы, которые имеют комментарий с текстом Manhattan в копии , и так далее.

Как мне добиться этого с помощью PgSearch?


person marcamillion    schedule 26.05.2015    source источник
comment
Не можете ли вы сделать это в контроллере с помощью манипуляций с регулярным выражением/строкой? Например, просто проверьте, существует ли «владелец:» как часть params[:search], а затем просто используйте некоторую условную логику?   -  person Ralph King    schedule 29.05.2015
comment
@OliverM звучит интересно. Можете ли вы показать мне пример кода. Спасибо!   -  person marcamillion    schedule 29.05.2015
comment
Хотя это кажется интересным, но я действительно сомневаюсь, что это вообще повлияет на производительность... (при условии, что все столбцы, в которых вы ищете, правильно проиндексированы). Я знаю, что вы ничего не упомянули о производительности, и вам это нужно только для фильтрации результатов...   -  person a14m    schedule 31.05.2015


Ответы (1)


Вы пытались использовать комбинации "Динамические области поиска" с некоторой обработкой контроллера строки поиска?

name: Bob, проанализировать столбцы/отношения и значение поиска, а затем передать его в pg_search_scope с лямбда-блоком?

person Bill    schedule 29.05.2015
comment
Можете ли вы показать мне пример кода, потому что я не могу его понять. - person marcamillion; 29.05.2015