pg_search для двух полей не возвращает результаты целого слова для одного поля - PullRequest
0 голосов
/ 30 мая 2020

Я использую pg_search в приложении rails вместо представления. В этом представлении есть два столбца tsvector, которые индексируются по двум столбцам, по которым я хочу искать, last_name и first_name. У меня tsearch настроен на prefix и соответствует any_word.

Допустим, у меня есть столбцы, заполненные как «Smith» и «John». Если я буду искать «Смит», я получу ожидаемые результаты. Однако, если я ищу «Джон», я не получаю вообще никаких результатов.

Вот моя область поиска, определенная в модели:

  pg_search_scope :search_by_name,
    against: [:last_name, :first_name],
    using: {
      tsearch: {
        prefix: true,
        any_word: true,
        tsvector_column: ["last_name_tsv", "first_name_tsv"]
      }
    }

А вот мои столбцы tsvector, определенные на вид:

  to_tsvector('english', coalesce(token_authenticate_me_users.first_name,'')) as first_name_tsv,
  to_tsvector('english', coalesce(token_authenticate_me_users.last_name,'')) as last_name_tsv,

А вот образец сгенерированного запроса для поиска только по полному имени first_name, который не возвращает результатов.

SELECT "candidate_searches"."member_id" 
FROM "candidate_searches" 
INNER JOIN 
  (SELECT "candidate_searches"."member_id" AS pg_search_id, 
    (ts_rank(
      ("candidate_searches"."last_name_tsv" || "candidate_searches"."first_name_tsv"), 
      (to_tsquery('simple', ''' ' || 'John' || ' ''' || ':*')), 0)) 
    AS rank 
   FROM "candidate_searches" WHERE
    (("candidate_searches"."last_name_tsv" || "candidate_searches"."first_name_tsv") @@ (to_tsquery('simple', ''' ' || 'John' || ' ''' || ':*')))
  ) 
  AS search ON "candidate_searches"."member_id" = search.pg_search_id  
ORDER BY search.rank DESC, "candidate_searches"."member_id" ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...