|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://www.sai.msu.su/~megera/wiki/tprewriter
Дата изменения: Unknown Дата индексирования: Sun Apr 10 17:50:12 2016 Кодировка: UTF-8 Поисковые слова: http www.astronomy.ru forum index.php topic 4644.0.html |
This module was designed specially for travelpost project. Design notes of full text search are available from tp search en.
FUNCTIONS:
select tp_rewrite (query::tsquery, keyword::tsquery)
select tp_rewrite (ARRAY[query::tsquery, test.keyword] ) from test
select tp_rewrite (query::tsquery,'select test.keyword from test'::text);
- Here, column test.keyword is of type tsquery.
- Rewrite original query by changing '&' to '|'.
Integrity of complex keyword is preserved by using '&' to
minimize possible noise.
example:
Rewrite query 'new & york & hotel' and preserve 'new & york'
regression=# select tp_rewrite(to_tsquery('new&york&hotel'),to_tsquery('new&york'));
tp_rewrite
--------------------------
'hotel' | 'york' & 'new'
regression=# select tp_rewrite( ARRAY['new&york&hotel'::tsquery, test.keyword] )
from test;
tp_rewrite
--------------------------
'hotel' | 'york' & 'new'
regression=# select tp_rewrite( 'new&york&hotel'::tsquery,'select test.keyword from test'::text);
tp_rewrite
--------------------------
'hotel' | 'york' & 'new'
Note:
tp_rewrite supports multiple keywords, but result depends on the
order of keywords.
Intersected keywords:
'new & york & city' - original query,
new & york', 'new & city' - keywords,
then tp_rewrite could produce two variants:
'new & york | city'
'new | york & city'
Embedded keywords:
'new & york & city & hotel' - original query,
'new & york & city', 'new & city' - keywords,
then tp_rewrite could produce two variants:
'new & york & city | hotel'
'new & city | york | hotel'
---------------------------------------------------------------------------
tp_substitute(query::tsquery,target::tsquery,sample::tsquery)
tp_substitute(ARRAY[query::tsquery,target::tsquery,sample::tsquery]) from test;
tp_substitute(query::tsquery, 'select test.target,test.sample from test');
- Here, columns test.target and test.sample are of type tsquery.
- substitute part of original query (sample) by specified target.
example:
Expand city name by its aliases.
regression=# select tp_substitute('new & york & hotel','new & york', 'nyc|gotham
|big& apple');
tp_substitute
------------------------------------------------------
'hotel' & ( 'apple' & 'big' | ( 'nyc' | 'gotham' ) )
Note:
tp_substitute doesn't supports embedded substitutions,
only first target will expands. For example, if we have aliases
(in followin order!):
'new & york & city' -> 'new & york | nyc' and
'new & york' -> 'gotham',
then query 'new & york & city & hotel'
will be '(new & york | nyc) & hotel'
---------------------------------------------------------------------------
tp_rewrite_substitute(query::tsquery,target::tsquery,sample::tsquery)
tp_rewrite_substitute(ARRAY[query::tsquery,target::tsquery,sample::tsquery]) from test;
tp_rewrite_substitute(query::tsquery,'select test.target,test.sample from test');
- combines tp_substitute and tp_rewrite functions in this order.
example:
Expand city name by its aliases and preserve integrity of city name.
regression=# select tp_rewrite_substitute('new & york & hotel','new & york',
'nyc|gotham|big& apple');
tp_rewrite_substitute
------------------------------------------------------
'hotel' | ( 'apple' & 'big' | ( 'nyc' | 'gotham' ) )
regression=# select tp_rewrite_substitute(ARRAY['new & york & hotel', test.target, test.sample]) from test;
tp_rewrite_substitute
-----------------------------------------------------------
'hotel' | ( 'nyc' | ( 'appl' & 'big' | 'york' & 'new' ) )
regression=# select tp_rewrite_substitute('select test.target, test.sample from test','new & york & hotel');
tp_rewrite_substitute
-----------------------------------------------------------
'hotel' | ( 'nyc' | ( 'appl' & 'big' | 'york' & 'new' ) )
OPERATORS:
tsquery @ tsquery - TRUE if right agrument *might* contained in left argument
tsquery ~ tsquery - TRUE if left agrument *might* contained in right argument
- these operators could be use to speedup tp_* functions filtering out
non-candidate tuples from table with samples.
example:
Check tuples iff test.target contained in query.
regression=# select tp_rewrite_substitute(ARRAY[query, test.target, test.sample]) from test,
to_tsquery('new & york & hotel') as query where
query @ test.target;
tp_rewrite_substitute
-----------------------------------------------------------
'hotel' | ( 'nyc' | ( 'appl' & 'big' | 'york' & 'new' ) )
note:
it's safe to use coalesce(tp_rewrite(ARRAY[...]),query), because
tp_rewrite(ARRAY[...]) returns NULL if query @ test.target fail (nothing found).
INDEX SUPPORT:
It's possible to create index to speedup operators @, ~.
example:
create index sample_idx on test using gist(sample gist_tp_tsquery_ops);
Documentation TODO:
1 добавлена ф-ция
int4 numnode( TSQUERY )
Возвращает суммарное число операндов и операций (проще говоря - число узлов
в перставлении запроса как дерево)
2 операции < <= = <> >= > (следует отметить, что меньше-больше отношения
для запросов величина странная и абстрактная, никакой реальной пользы из
этого извлень нельзя, кроме быстрого поиска на совпадение. Единственно, что
гарантируется - однозначность такого сравнения)
3 BTree index on tsquery