tp search

Основная идея: весь поиск и сложное ранжирование производить с помощью т2. Для
этого нужно сделать следующее (авторы предполают достаточно близкое знакомство
читаеля с т2):


1 Изменения в таблицах. Названия таблиц достаточно условны. Поисковый запрос
делается для каждой сущности отдельно.
        place. Добавить колонку tsvector placeidx, которая формируется путем
        слияния tsvector'ов от следующих полей (с учетом веса, список сортирован
        по убыванию веса).
                country name
                place name
                place description (?)

        hotels. Добавить колонку tsvector hotelidx, которая формируется путем
        слияния tsvector'ов от следующих полей (с учетом веса, список сортирован
         по убыванию веса).
                country name
                place name
                hotel name
                hotel description (?)

        Journal / Itinerary search. Добавить колонку tsvector journalidx,
        которая формируется путем слияния tsvector'ов от следующих полей (с
        учетом веса, список сортирован по убыванию веса).
                country name
                place name
                текст статьи

   Таким образом, поле hotelidx для отеля Moscow's celebrations hotel в Moscow,
Russia будет выглядеть таким образом:
   'russia:1A moscow:3B,4 celebration:5 hotel:6'
  Напоминаие: буква после позиции лексемы указавает на класс вхождения лексемы и
учитывается при ранжировании путем указания веса классу. По умолчанию веса
равны: A=1.0, B=0.4, C=0.2, D=0.1 (default)


2 Поля *idx формируются вызовами to_tsvector. Конфигурация т2 должна включать в 
себя словарь синонимов (st - saint, hotel - resort и тд). 
Примечание 1: 
Существующий словарь синонимов не использует морфологизацю, но может это может 
понадобиться в случае если словарь синонимов бует излишне велик. 
Примечание 2: 
Для каждой колонки может быть необходимым использование своего списка 
стоп-лексем и словарей.

3 Запрос обрабатывается методом to_tsquery, результат метода непосредственно
используется в поисковом запросе по journal. В посиковых запросах по hotel &
place запрос проходит предобработку специальным методом (который предстоит
написать) по следующему правилу: все логические И заменяются на логические ИЛИ
кроме тех, которые связывают части составных названий. Например, если исходный
запрос "New York Hilton resorts" ->(to_tsquery)-> "new & york & hilton & hotel"
->(preprocess)->"(new & york) | hilton | hotel". Целями данной предобработки
является:
        - максимально возможно полный поиск
        - уменьшение ложных срабатываний из-за составных названий

4 Ранжирование производиться ф-цией rank() из модуля t2. С помощью указания
весов классов лексем возможно гибкое онлайновое влияние на результат ранжирования.

Общие замечания:
1 предлагаемы механизм неоптимален для апдейта названий мест и стран, поскольку
апдейт вынужден изменять *idx поля у связанных объектов.

2 Поскольку результат ранжирования зависит от
        - классов найденных лексем
        - количества найденных лексем в *idx
  то желаемое поведения ранжирования получается автоматически


Примеры
create table hotels ( name text, country text, place text, idx tsvector);
insert into hotels values ('Moscow''s celebrations hotel', 'Russia', 'Moscow',
null);
insert into hotels values ('Hilton hotel', 'Russia', 'Moscow', null);
insert into hotels values ('Hilton hotel', 'Canada', 'Toronto', null);
insert into hotels values ('Moscow hotel', 'Canada', 'Toronto', null);
update hotels set idx=setweight( to_tsvector(country), 'A' ) || setweight(
to_tsvector(place), 'B' ) || to_tsvector(name);
# select name, country, place from hotels ;
             name             | country |  place
-----------------------------+---------+---------
  Moscow's celebrations hotel | Russia  | Moscow
  Hilton hotel                | Russia  | Moscow
  Hilton hotel                | Canada  | Toronto
  Moscow hotel                | Canada  | Toronto


# select name, country, place, rank( idx, ftsquery ) as r from hotels,
to_tsquery('Moscow') as ftsquery where idx @@ ftsquery order by r desc;
             name             | country |  place  |  r
-----------------------------+---------+---------+------
  Moscow's celebrations hotel | Russia  | Moscow  | 0.46
  Hilton hotel                | Russia  | Moscow  |  0.4
  Moscow hotel                | Canada  | Toronto |  0.1
(3 rows)

# select name, country, place, rank( idx, ftsquery ) as r from hotels,
to_tsquery('Moscow | hotel') as ftsquery where idx @@ ftsquery order by r desc;
             name             | country |  place  |   r
------------------------------+---------+---------+-------
  Moscow's celebrations hotel | Russia  | Moscow  | 0.514
  Hilton hotel                | Russia  | Moscow  |  0.46
  Moscow hotel                | Canada  | Toronto |  0.19
  Hilton hotel                | Canada  | Toronto |   0.1
(4 rows)
----------------------------+---------+---------+-------