Текстовый поисковый запрос лексемы Postgress содержит только стоп-слова или не содержит лексем, игнорируется - PullRequest
0 голосов
/ 23 апреля 2020

Я использую полнотекстовый поиск с индексом GIN.

create index cn_custom_index on category
using GIN(to_tsvector('english',coalesce(category_name,'')||' '))

и когда я использую * - можно присоединить к лексеме для указания соответствия префикса. У меня странное поведение, в одном случае поиск привел к тому, что не имеет, но должен был. Пример Я ищу по inr:* и получаю четыре результата, но при попытке поиска по in:* у меня ничего не было, пустой результат, но должен получиться тот же результат, что и при поиске с inr:*

SELECT                         
DISTINCT category_alias.id,
category_alias.category_name AS "category_name",
category_alias.created_at AS "createdAt",
ts_rank_cd(to_tsvector('english',coalesce(category_name,'')||' '), query_search) AS rank

FROM category category_alias 

JOIN to_tsquery('inr:*') query_search
ON to_tsvector('english',coalesce(category_name,'')||' ') @@ query_search

GROUP BY category_alias.id, query_search.query_search ORDER BY rank DESC, "createdAt" DESC

результат

1320    Inre skönhet    2020-04-21 16:25:17 0.1
195 Inredningsdetaljer  2020-04-02 20:20:10 0.1
62  Inredning   2020-03-27 17:43:15 0.1
9   Hem & inredning 2020-03-27 17:43:11 0.1

и поиск с помощью in:*

SELECT                         
DISTINCT category_alias.id,
category_alias.category_name AS "category_name",
category_alias.created_at AS "createdAt",
ts_rank_cd(to_tsvector('english',coalesce(category_name,'')||' '), query_search) AS rank

FROM category category_alias 

JOIN to_tsquery('in:*') query_search
ON to_tsvector('english',coalesce(category_name,'')||' ') @@ query_search

GROUP BY category_alias.id, query_search.query_search ORDER BY rank DESC, "createdAt" DESC

с тем же поведением, с которым я столкнулся при попытке поиска по одному символу, например, f результат возврата, но с s У меня ничего не было

Я пытаюсь подать в суд simple за to_tsquery

SELECT                         
DISTINCT category_alias.id,
category_alias.category_name AS "category_name",
category_alias.created_at AS "createdAt",
ts_rank_cd(to_tsvector('english',coalesce(category_name,'')||' '), query_search) AS rank

FROM category category_alias 

JOIN to_tsquery('simple','s:*') query_search
ON to_tsvector('english',coalesce(category_name,'')||' ') @@ query_search

GROUP BY category_alias.id, query_search.query_search ORDER BY rank DESC, "createdAt" DESC

и результат появляется, но вопрос в этом случае индекс GIN работает правильно? Или я должен изменить индекс на

create index cn_custom_index on category
using GIN(to_tsvector('simple',coalesce(category_name,'')||' '))

правильно?

1 Ответ

0 голосов
/ 23 апреля 2020

to_tsquery применяет фильтрацию и остановку стоп-слов даже к вещам, отмеченным :*. Возможно, он не должен этого делать, но, тем не менее, это то, что он делает.

Вы можете обойти это, написав tsquery напрямую, а не используя to_tsquery:

JOIN (select 'in:*'::tsquery) query_search(query_search)

Но, возможно, вам следует вместо этого переключитесь на «простой», как вы предлагаете, и потому, что поиск префикса по своей сути проблематичен c, когда установлены стоп-слова и основополагающие слова, и потому что искомые объекты явно не Engli sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...