Комбинируйте запрос, чтобы получить весь соответствующий поисковый текст в правильном порядке - PullRequest
0 голосов
/ 12 июля 2020

У меня есть следующая таблица:

postgres=# \d so_rum;
                        Table "public.so_rum"
  Column   |          Type           | Collation | Nullable | Default 
-----------+-------------------------+-----------+----------+---------
 id        | integer                 |           |          | 
 title     | character varying(1000) |           |          | 
 posts     | text                    |           |          | 
 body      | tsvector                |           |          | 
 parent_id | integer                 |           |          | 
Indexes:
    "so_rum_body_idx" rum (body)

Я хотел выполнить фразовый поисковый запрос, поэтому я придумал следующий запрос, например:

select id from so_rum
    where body @@ phraseto_tsquery('english','Is it possible to toggle the visibility');

Это дает мне результаты, которые соответствуют только всему тексту. Однако есть документы, в которых расстояние между лексмами больше, и приведенный выше запрос не возвращает мне эти данные. Например: 'it is something possible to do toggle between the. . . visibility' не возвращается. Я знаю, что могу вернуть его с помощью оператора расстояния <2> (например), указав to_tsquery вручную.

Но я хотел понять, как это сделать в самом моем операторе sql , так что сначала я получаю результаты с расстоянием 1, затем 2 и так далее (может быть до 6-7). Наконец, добавьте результаты с фактическим количеством поисковых слов, как в следующем запросе:

select count(id) from so_rum
    where body @@ to_tsquery('english','string & string . . . ')

Можно ли сделать один запрос с хорошей производительностью?

1 Ответ

1 голос
/ 12 июля 2020

Я не вижу готового решения этой проблемы. Похоже, вам нужно использовать plainto_tsquery для получения всех результатов со всеми лексемами, а затем реализовать свою собственную функцию ранжирования, чтобы ранжировать их по расстоянию между лексемами и, возможно, отфильтровать те, которые имеют неправильный порядок.

...