Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://www.sai.msu.su/~megera/wiki/tp_search
Дата изменения: Unknown Дата индексирования: Sun Apr 10 15:01:06 2016 Кодировка: UTF-8 Поисковые слова: 3 |
Основная идея: весь поиск и сложное ранжирование производить с помощью т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) ----------------------------+---------+---------+-------