Поисковая система, как полнотекстовый поиск в PostgreSQL - PullRequest
0 голосов
/ 22 марта 2020

У меня есть список заголовков и описаний в таблице, которые проиндексированы в столбце tsvector . Как я могу реализовать Поиск Google как полнотекстовый поиск в Postgres для этих полей. Я пробовал различные функции, предлагаемые стандартным Postgres, такие как

to_tsquery('apple | orange') -- apple | orange

Эта функция возвращает строки, если она имеет один из этих терминов, поэтому она не дает очень релевантных результатов наверху который должен иметь оба условия.

plainto_tsquery('apple orange') -- apple & orange

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

phraseto_tsquery('apple orange') -- apple <> orange

Эта функция соответствует только оранжевый , за которым следует яблоко , но не наоборот. Но для меня апельсин <> яблоко также по-прежнему актуально.

Я также пробовал websearch_to_tsquery(), но он ведет себя очень похоже на вышеуказанные функции.

Как я могу попросить Postgres сначала перечислить очень релевантные строки, которые содержат большинство терминов в поисковом запросе независимо от порядка терминов, а затем следуют строки с меньшим количеством терминов?

1 Ответ

0 голосов
/ 22 марта 2020
to_tsquery('apple | orange')   --  apple | orange

Эта функция возвращает строки, если она имеет один из этих терминов, поэтому она не дает особо релевантных результатов в верхней части, которые должны иметь оба условия.

Если вы не укажете, как упорядочивать строки, строки одного запроса возвращаются в произвольном порядке. «ORDER BY» не существует «top», есть только то, что происходит в первую очередь.

Как я могу попросить Postgres сначала перечислить очень релевантные строки, которые содержат большинство терминов в поисковом запросе независимо от порядка терминов, а затем следуют строки с меньшим количеством терминов?

Используйте оператор |, затем ранжируйте эти строки с помощью ts_rank, ts_rank_cd или пользовательского функцию ранжирования ты пишешь сам. Для повышения производительности вы можете сначала использовать оператор &, а затем вернуться к |, если строк недостаточно.

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

Было бы хорошо, если бы введение websearch_to_tsquery или фразуto_tsquery также ввело некоторые соответствующие функции ранжирования. Но поскольку они изобрели только упорядоченную близость, а не близость без порядка, маловероятно, что они захотят, если они существуют.

...