Получается, что комбинации лексем (в целях оптимизации поиска) они не
хранят.

Поэтому чтобы получить данные, в которые входят несколько лексем,
нужно построить пересечение.

Неужто в PG так здорово работают join-ы на больших объемах? Если
судить по восторгам о том как там все здорово сделано?

А кто тебе сказал, что join идет по таблице с данными?

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

Ни Lucene, ни, если я правильно понял, PgSQL FTS не ограничены этим - отбор кандидатов идет по индексу - идет оценка всего полнотекстового запроса, а не его отдельных термов с последующим джойном "отсеяных" резалтсетов с реальными даными. В PgSQL для GiST индекса нужна еще последующая фильтрация, для GIN оно должно работать сразу.

Скажу еще - для того чтоб сделать поддержку запросов типа "wordA NEAR wordB MAX_DISTANCE 10", то на обычном SQL придется очень сильно извращатся. Да и для обычных "wordA AND wordB AND wordC" количество джойнов растет пропорционально (количество записей для проверки - экспоненциально).

Как workaround ты как раз и пробуешь в словарь добавить целые фразы... Другие строят свой "индекс" в котором идет оценка всего запроса и возвращаются только подходящие результаты. При чем, если реализация нормальная, то автоматически считается score для проиндексированого документа и hits возвращаются в убывающем порядке.

Роман

Ответить